世界空间逆投影透视

Posted

技术标签:

【中文标题】世界空间逆投影透视【英文标题】:perspective to world space inverse projection 【发布时间】:2012-04-17 14:10:20 【问题描述】:

我正在将阴影功能扩展到我作为课堂作业创建的现有 3d 渲染器。我正在尝试实现 2 pass z 缓冲区算法。我已经完成了第一遍并创建了深度图。但是,问题是我在屏幕空间中栅格化了我的线条,因此我必须将我的坐标带回图像空间,因为深度图的 z 值与片段坐标的 z 值之间的比较发生在图像空间中。

我使用堆栈实现,它以以下形式存储空间变换矩阵:

[Xsp] * [Xpi] * [Xiw ] * (x,y,z) 世界空间中的坐标 = 屏幕空间中的 x,y,z Xsp - 屏幕透视 Xpi - 图像到透视 Xiw - 图像世界

这里,栈底包含Xsp,倒数第二个包含,Xsp与Xpi相乘,倒数第三个包含Xsp * Xpi与Xiw相乘的结果.....

现在,我只想要图像空间中的 x,y,z , 即(Xiw * x,y,z in world space),所以在世界空间中获取 x,y,z 对我有用...... 如果我将每个矩阵的逆相乘,然后将结果与屏幕空间中的 x,y,z 相乘,是否有可能实现???

我的意思是,我想做

[Xsp]inverse * [Xpi]inverse * [Xiw]inverse ,并将其与屏幕空间的 x,y,z 相乘 它会让我回到世界空间吗??

【问题讨论】:

请记住,当您反转两个矩阵的乘积时,您需要颠倒顺序 -- ([A][B])inverse = [B]inverse * [A]inverse。 【参考方案1】:

让我猜猜。南加州大学 CS580?

无论如何我都会帮忙的。

你最初是如何得到你的顶点的:

Xsp * Xpi * Xiw * Xwm * v = vf //Concat * model-space vertex = raster-space vertex

vf' = (vf.x / vf.w, vf.y / vf.w, vf.z / vf.w); //Perspective

如何用 vf' 找回它:

Xwm * vf = Xiw^-1 * Xpi^-1 * Xsp^-1 * vf' //Inverted partial concat * raster-space vertex = world-space vertex

v = (vf.x / vf.w,  vf.y / vf.w, vf.z / vf.w); //Perspective again

法线是相同的想法,除了你只需要一个倒置的 Xiw 就可以回到世界空间,因为法线只进入图像空间。也没有涉及到视角。

【讨论】:

以上是关于世界空间逆投影透视的主要内容,如果未能解决你的问题,请参考以下文章

three.js正交投影照相机

SharpGL之透视投影和摄像机

4D转3D透视投影

视觉高级篇21 # 如何添加相机,用透视原理对物体进行投影?

视觉高级篇21 # 如何添加相机,用透视原理对物体进行投影?

OpenCV中的透视变换介绍