3d 单应矩阵后处理中的平面重投影
让我们来看一个代理问题-您正在查看某个3D场景。现在,我使用从眼睛位置进行的渲染替换场景,这样您就看不到任何差异。然后我用墙和投影仪替换渲染图像。我需要的是一个图像,当投影到墙上时,它看起来就像你在看场景一样 看起来是这样的: 左边的相机是观测者,右边的是投影仪 我的方法是从观察者的位置渲染场景,然后在后期处理中对渲染图像采样以添加失真 我有一些概念验证代码,这些代码可以达到我需要调试的偏移量,但是大多数计算都是在像素着色器中完成的,所以这不是最好的解决方案 在我完成我的初始版本后,我阅读了关于单应矩阵的内容,它似乎是适合我需要的工具。如果我理解正确,我应该能够计算单应矩阵,然后将我的屏幕空间UV与之相乘,得到重新投影的UV 不幸的是,我能找到的关于单应性的大部分信息都与这样的情况有关:当我有2张某个物体的图片,用手拾取4个对应的点对,然后从中计算出一个矩阵,但我没有这样的点。相反,我知道这两个视图的精确变换,它们的垂直和水平视场和平面,所以我认为这就是我所需要的 完美的解决方案是进行一些变换,将我的图像空间UV映射到[0,1]范围内,以校正纹理采样的UV。你们有谁看到过类似的解决方案吗 编辑: 我已经从我的POC实现中截图: 我不确定1:1是否正确,但它显示了我的需要。渲染是扭曲的,但当我将此图像投影到墙上时,这种扭曲应该会被抵消。请看一下桌面-它看起来仍然像是从侧面渲染的,而不是从投影仪渲染的。当我将此图像投影到墙上时,它应该看起来像是从您的眼睛位置渲染的。根据我们的,在UE中未实现keystone校正。因此,我建议如下:3d 单应矩阵后处理中的平面重投影,3d,linear-algebra,transformation,unreal-engine4,homography,3d,Linear Algebra,Transformation,Unreal Engine4,Homography,让我们来看一个代理问题-您正在查看某个3D场景。现在,我使用从眼睛位置进行的渲染替换场景,这样您就看不到任何差异。然后我用墙和投影仪替换渲染图像。我需要的是一个图像,当投影到墙上时,它看起来就像你在看场景一样 看起来是这样的: 左边的相机是观测者,右边的是投影仪 我的方法是从观察者的位置渲染场景,然后在后期处理中对渲染图像采样以添加失真 我有一些概念验证代码,这些代码可以达到我需要调试的偏移量,但是大多数计算都是在像素着色器中完成的,所以这不是最好的解决方案 在我完成我的初始版本后,我阅读了关于
对于设置,您只需重置平面上的所有设置(旋转、位置、比例等),并设置另一种材质,最好使用正方形-您可以很容易看到,这可以帮助您正确修改平面。所以它只是把投影平面弄乱了。我终于找到了解决办法 在一些关于单应性的文章中,我看到了一个方程,可以从两个视口的已知变换计算H矩阵,但无法使其工作,可能是我误解了某些内容或数学错误,所以我决定尝试4点方法,但如何自动获得这些点 鉴于我将在渲染的后处理阶段使用它,因此主要在屏幕空间中操作,我决定将目标视口的角点映射到源视口 从
投影仪
变换中,我得到前进方向
,并将其旋转垂直和水平视场的一半。结合正值和负值,我可以得到4个向量,对应于视口的4个角,在世界空间中计算
使用投影仪
位置作为起点,4个计算向量作为方向,我可以计算出4个与平面
的交点。这些是世界空间点,位于我的平面上
,代表从投影仪可见的的角落
有了这4个点,我就用Observer
camera将它们投射到屏幕空间
我在这里得到的点是观察者屏幕空间
点,鉴于我已经映射了投影仪的整个视口
,我可以使用典型的[0,0]、[1,0]、[0,1]、[1,1]
矩形作为投影仪屏幕空间点
这样,我就有了四对对应的点
,用于我的单应性
单应
这有点棘手,因为我仍然不完全理解这里的数学,但我使用了这个:
文章,第29页有一个使用8x8
平方矩阵的矩阵方程。链接可能会消失,但您可以在许多地方找到相同的等式,重要的是我使用了8x8
版本,但看到了使用8x9
矩阵的符号
屏幕如下:
一般来说,它是一个a*x=b的符号,我们知道a和b,并且想要计算x
对于计算,我使用了库中的JacobiSVD
类
在得到8个浮点数后,我可以构建我要寻找的矩阵的3行向量。前3个值形成第一个向量,另外3个值形成第二个向量,然后我们只剩下2个值,所以我们附加1.0f来得到最后一个向量
让我们把这个矩阵称为H
像素着色器
每帧完成所有这些计算后,像素着色器
非常简单-我们只需要变换屏幕空间UV