我需要用gluLookAt()
和glRotatef()
操作替换glTranslatef()
操作。
我想用gluLookAt(1,1,0,0,0,0,0,1,0);
做到这一点,但我猜到了一些数字,但我得到了相同的图片。
背后的数学是什么?我该如何随机gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upZ, upY, upZ)
并将其更改为旋转和翻译并获得相同的图片?
答案 0 :(得分:2)
gluLookAt (...)
设置视图空间的轴和原点。在我看来,更容易考虑每个列所代表的内容,而不是将此操作转换为一系列翻译和轮换(尽管从根本上说就是这样)。
要设置视图空间的方向,gluLookAt (...)
基本上计算各个轴。在 没有点 的情况下永远处理像glRotatef (...)
这样的欧拉角度需要你做的事情。鉴于视图空间gluLookAt (...)
产生的是正交的,仅从两个计算第三个轴是微不足道的。
然后将这三个轴存储在矩阵X,Y,Z的列1-3中。
最后,由于观看变换除了旋转之外还有位置,因此摄像机的视点存储在矩阵的第4列。
Axes Diagram http://www.songho.ca/opengl/files/gl_anglestoaxes01.png
老实说,只是自己设置矩阵而不是处理欧拉角和glRotatef (...)
更方便。
答案 1 :(得分:0)
我同意Andon的观点,即找到整个矩阵要容易得多。但是,如果您仍然需要找到glRotate
和glTranslate
的分解,那么您可以按照这些步骤操作,至少在此特定设置下。
我们需要找到一个转换,它将 xyz 坐标系中一个点的表示转换为 x'y'z'坐标系中的表示(不同于转变点)。这与将橙色系统与蓝色系统对齐相同。
关于这种转变,我们可以说两件事:
要进行转换,我们会执行以下操作:
这可以概括为:
glRotatef(45, 0, 0, 1);
glRotatef(90, 0, 1, 0);
glTranslatef(-1, -1, 0);