【发布时间】:2015-03-24 11:48:21
【问题描述】:
我目前正在尝试自学透视投影,我的参考资料是这里有关该主题的维基百科页面:http://en.wikipedia.org/wiki/3D_projection#cite_note-3
我的理解是,您将对象投影并旋转并将其转换为“相机空间”,这样您的相机现在被假定为直接向下看 z 轴的原点。 (此矩阵操作来自维基百科页面:http://upload.wikimedia.org/math/5/1/c/51c6a530c7bdd83ed129f7c3f0ff6637.png)
然后,您可以使用以下等式将新点投影到 2D 空间:http://upload.wikimedia.org/math/6/8/c/68cb8ee3a483cc4e7ee6553ce58b18ac.png
我可以完美完成的第一步。当然,我编写了自己的矩阵库来做到这一点,但我通过在搅拌机中输入结果并将相机移动到 0,0,0 并检查它是否呈现与默认场景相同来验证它是否吐出了正确的答案。
但是,投影部分是出了问题的地方。
据我所见,我应该采用视野,在搅拌机中默认为 28.842 度,并使用它来计算 wikipedia 调用 ez 的值,通过这样做
ez = 1 / tan(fov / 2);
在这种情况下约为 3.88。
然后我应该为每一点做:
x = (ez / dz) * dx; y = (ez / dz) * dy;
获取 -1 到 1 范围内的 x 和 y 坐标,然后我可以根据屏幕宽度适当缩放。
但是,当我这样做时,我的投影图像在 x 轴上镜像,并且在任何情况下都与立方体混合器渲染不匹配。我做错了什么,我应该怎么做才能获得正确的投影坐标?
我知道你可以用一个矩阵运算完成整个事情,但目前我只是想理解方程式,所以请坚持提出的问题。
【问题讨论】:
-
我想我们需要看看一些实际的代码。你在使用 OpenGL 吗?即使您的对象的顶点坐标是 3D,OpenGL 和 GLSL 都会创建第 4 个分量 (w) 并期望 4X4 矩阵。实际上,您需要三个矩阵:模型、视图和投影。
-
视图矩阵由相机(眼睛)的位置、视图方向和相机向上方向组成。投影矩阵定义了截头体,由左、右、上、下、近和远裁剪平面组成。模型矩阵由各种变换组成,如缩放、旋转和平移。您将每个顶点乘以这三个矩阵:投影 * 视图 * 模型 * 顶点。顺便说一句,如果您不使用 OpenGL 或 GLSL,请使用 1.0 作为 w 坐标。
-
谷歌 glFrustum 和 gluLookAt 看看如何形成投影和视图矩阵。
标签: projection perspective rotational-matrices