1

我正在做我自己的世界-> cam 转换(而不是使用gluLookAt)。我在关注这里的信息,但我得到了一个不同的符号来翻译最终的 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。然后,加载T*Rwith的转置glLoadMatrix(因为 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

问题是,文章是否正确???

4

1 回答 1

0

OpenGL 本身不是左撇子或右撇子。OpenGL 的剪辑和窗口空间通常被认为是右手使用的(尽管如果真的想要的话,也可以反过来使用它们)。

在经典的固定功能管道中,眼睛和对象空间通常是用左手定义的。gluLookAt()使用此约定。另外gluPerspective()//使用这个约定作为他们所采用的近glFrustum()glOrtho()远的正值实际上是指眼睛空间中的z 值。这些投影矩阵通常会改变惯用手。

于 2013-10-10T21:21:04.360 回答