【发布时间】:2013-10-18 11:04:45
【问题描述】:
我在做我自己的世界 -> cam 转换(而不是使用 gluLookAt)。我关注了here 的信息,但我得到了一个不同的符号来进行最终的 4x4 模型视图转换。
文章说“由于我们是向下看 x 轴,所以世界是由相机的负位置平移的。”。然后他们翻译成-eye,在我的代码中是-camPos。
我认为这是不对的,因为 opengl 是惯用右手的,并且相机通常向下看 -Z(远离屏幕)。所以看来正确的翻译变换应该是+camPos。
float lookAtP[3] = {0,0,0}; /* camera look at point */
float camPos[3] = {0,0,-150}; /* camera location */
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camPos[0],camPos[1],camPos[2], lookAtP[0],lookAtP[1],lookAtP[2], 0,1,0);
GLfloat matrix[16];
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
mat_print(matrix);
结果(gluLookAt):
-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 0.0000
0.0000 0.0000 -150.0000 1.0000
当我关注文章时,我得到了不同符号的翻译 (+150)。我计算旋转矩阵R,然后平移T。然后,用glLoadMatrix加载T*R的转置(因为opengl是右手的,本文处理的是左手坐标系)。
-1.0000 0.0000 0.0000 0.0000
0.0000 1.0000 0.0000 0.0000
0.0000 0.0000 -1.0000 0.0000
0.0000 0.0000 150.0000 1.0000
问题是,文章是否正确???
【问题讨论】:
-
嗯,你说得对,GL_MODELVIEW矩阵是右手的,相机矩阵是左手的……我会读这篇文章,看看我是否能得到更多的结论。
-
NDC,这是在最终视口变换为左手之前最终进入的坐标空间。这是 OpenGL 中唯一无法控制的坐标空间,z=-1 始终是最近的深度,z=1 始终是最远的深度。只要最终产品在逻辑上映射到左手 NDC,深度范围、投影和您的模型视图矩阵都可以在不同的惯用手中拥有各种中间坐标空间。在固定功能管道中,投影之前的一切都是右手的,投影矩阵/深度范围是产生正确 NDC 的原因。