3d 单应矩阵后处理中的平面重投影

3d 单应矩阵后处理中的平面重投影,3d,linear-algebra,transformation,unreal-engine4,homography,3d,Linear Algebra,Transformation,Unreal Engine4,Homography,让我们来看一个代理问题-您正在查看某个3D场景。现在,我使用从眼睛位置进行的渲染替换场景,这样您就看不到任何差异。然后我用墙和投影仪替换渲染图像。我需要的是一个图像,当投影到墙上时,它看起来就像你在看场景一样 看起来是这样的: 左边的相机是观测者,右边的是投影仪 我的方法是从观察者的位置渲染场景,然后在后期处理中对渲染图像采样以添加失真 我有一些概念验证代码,这些代码可以达到我需要调试的偏移量,但是大多数计算都是在像素着色器中完成的,所以这不是最好的解决方案 在我完成我的初始版本后,我阅读了关于

让我们来看一个代理问题-您正在查看某个3D场景。现在,我使用从眼睛位置进行的渲染替换场景,这样您就看不到任何差异。然后我用墙和投影仪替换渲染图像。我需要的是一个图像,当投影到墙上时,它看起来就像你在看场景一样

看起来是这样的: 左边的相机是观测者,右边的是投影仪

我的方法是从观察者的位置渲染场景,然后在后期处理中对渲染图像采样以添加失真

我有一些概念验证代码,这些代码可以达到我需要调试的偏移量,但是大多数计算都是在像素着色器中完成的,所以这不是最好的解决方案

在我完成我的初始版本后,我阅读了关于单应矩阵的内容,它似乎是适合我需要的工具。如果我理解正确,我应该能够计算单应矩阵,然后将我的屏幕空间UV与之相乘,得到重新投影的UV

不幸的是,我能找到的关于单应性的大部分信息都与这样的情况有关:当我有2张某个物体的图片,用手拾取4个对应的点对,然后从中计算出一个矩阵,但我没有这样的点。相反,我知道这两个视图的精确变换,它们的垂直和水平视场和平面,所以我认为这就是我所需要的

完美的解决方案是进行一些变换,将我的图像空间UV映射到[0,1]范围内,以校正纹理采样的UV。你们有谁看到过类似的解决方案吗

编辑:

我已经从我的POC实现中截图: 我不确定1:1是否正确,但它显示了我的需要。渲染是扭曲的,但当我将此图像投影到墙上时,这种扭曲应该会被抵消。请看一下桌面-它看起来仍然像是从侧面渲染的,而不是从投影仪渲染的。当我将此图像投影到墙上时,它应该看起来像是从您的眼睛位置渲染的。

根据我们的,在UE中未实现keystone校正。因此,我建议如下:

  • 使用观察者摄影机创建所需场景
  • 在屏幕上的某个地方添加平面程序性!)和摄像机,主摄像机在平面上观看
  • 使主摄像机成为玩家的主摄像机
  • 将材质创建为RenderTarget(),并将Observer camera设置为该材质的源
  • 现在您已经设置了在平面上渲染场景,玩家将看到该平面

    如果需要模拟keystone校正,可以更改平面的位置或旋转。(您可以将该操作绑定到设置GUI等)并且由于它是程序性的,所以您可以以垂直或水平方式更改大小(和形状)。()

    由于您有一个具有恒定UV的平面,并且您正在更改其形状,因此结果将是该平面上的keystone efect,这(在正确的平面设置情况下)将导致HW投影仪上的keystone efect相反,从而生成正确的图像


    对于设置,您只需重置平面上的所有设置(旋转、位置、比例等),并设置另一种材质,最好使用正方形-您可以很容易看到,这可以帮助您正确修改平面。所以它只是把投影平面弄乱了。

    我终于找到了解决办法

    在一些关于单应性的文章中,我看到了一个方程,可以从两个视口的已知变换计算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