透视投影 - 帮我复制blender的默认场景

时间:2015-01-26 01:53:07

标签: projection perspective rotational-matrices

我目前正在尝试自学角度投影,我的参考是这里主题的维基百科页面: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并检查它与默认场景相同来验证它正在吐出正确的答案。 / p>

然而,投影部分是出错的地方。

从我所看到的,我应该采取视野,默认情况下在搅拌机中是28.842度,用它来计算维基百科调用ez的值,通过做

ez = 1 / tan(fov / 2);

在这种情况下约为3.88。

我应该为每一点做点:

x =(ez / dz)* dx; y =(ez / dz)* dy;

获取-1到1范围内的x和y坐标,然后我可以根据屏幕宽度进行适当缩放。

然而,当我这样做时,我的投影图像在x轴上镜像,并且在任何情况下都与立方体混合器渲染不匹配。我做错了什么,我应该做些什么来获得正确的投影坐标?

我知道你可以用一个矩阵运算完成这一切,但目前我只是想了解方程式,所以请坚持问问题。

1 个答案:

答案 0 :(得分:-1)

根据您在问题中的说法,我们不清楚您是否在使用投影矩阵或模型矩阵时遇到问题。

就像我在评论中所说,你可以通过谷歌glFrustum和gluLookAt来确切了解这些矩阵的样子。如果您熟悉矩阵数学(看起来像你),那么您将了解如何将坐标转换为2D透视图。

以下是一些示例OpenGL代码,用于制作视图和投影矩阵和模型矩阵,以便围绕Y轴进行简单的30度旋转,以便您可以看到如何计算进入这些矩阵的组件。

// The Projection Matrix

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
near = -camera.viewPos.z - shapeSize * 0.5;
if (near < 0.00001)
    near = 0.00001;

far = -camera.viewPos.z + shapeSize * 0.5;
if (far < 1.0)
    far = 1.0;
radians = 0.0174532925 * camera.aperture / 2; // half aperture degrees to radians
wd2 = near * tan(radians);
ratio = camera.viewWidth / (float) camera.viewHeight;
if (ratio >= 1.0) {
    left  = -ratio * wd2;
    right = ratio * wd2;
    top = wd2;
    bottom = -wd2;
} else {
    left  = -wd2;
    right = wd2;
    top = wd2 / ratio;
    bottom = -wd2 / ratio;
}

glFrustum (left, right, bottom, top, near, far);

// The View Matrix

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();
gluLookAt (camera.viewPos.x, camera.viewPos.y, camera.viewPos.z,
           camera.viewPos.x + camera.viewDir.x,
           camera.viewPos.y + camera.viewDir.y,
           camera.viewPos.z + camera.viewDir.z,
           camera.viewUp.x, camera.viewUp.y ,camera.viewUp.z);

// The Model Matrix

glRotatef (30.0, 0.0, 1.0, 0.0);

你会看到glRotate实际上是一个四元数旋转(旋转角加上一个旋转的矢量)。

您还可以对X,Y和Z轴进行单独旋转。

网上有很多关于如何为旋转,平移和缩放形成4X4矩阵的信息。如果分别执行这些操作,则需要将它们相乘以获得模型矩阵。 e.g:

如果您有4X4矩阵rotateX,旋转Y,旋转Z,平移,缩放,您可以通过以下方式形成模型矩阵:

模型=缩放* rotateX * rotateZ * rotateY * translate。

在形成模型矩阵时,顺序很重要。如果以不同的顺序进行乘法,则会得到不同的结果。

如果您的物体位于原点,我怀疑您是否也想将相机放在原点。