我需要将gluLookAt()操作替换为glRotatef()glTranslatef()操作。
我想通过gluLookAt(1,1,0,0,0,0,0,1,0);来做到这一点,但我只是猜到一些数字,直到我得到相同的图片。

这背后的数学是什么?我怎样才能随机取一个gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upZ, upY, upZ)并将其更改为旋转和平移并获得相同的图片?

最佳答案

gluLookAt (...)设置视图空间的轴和原点。

我认为,考虑每个单独列所代表的内容要比将该操作转换为一系列平移和旋转要容易得多(即使从根本上来说就是这样)。

要设置视图空间的方向,gluLookAt (...)基本上会计算各个轴。它绝对不会像glRotatef (...)那样要求您处理任何欧拉角。鉴于视图空间gluLookAt (...)产生的事实是正交的,因此仅从两个轴计算第三轴就很简单了。


Z轴(正向)计算为从eyexyz到centerxyz的方向
Y轴(向上)直接表示为upxyz
X轴(右)被计算为向上和向前向量之间的叉积


然后,将这三个轴存储在矩阵X,Y,Z的列1-3中。

最后,由于观看变换除了旋转之外还具有其他位置,因此摄像机的视点存储在矩阵的第4列中。

请看Song Ho Ahn(안성호),OpenGL Transformation中的以下图表:

c++ - 从glLookAt()到glRotatef()和gltranslatef-LMLPHP

老实说,只需要自己设置矩阵而不是处理Euler角和glRotatef (...)会更方便。

关于c++ - 从glLookAt()到glRotatef()和gltranslatef,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23370126/

10-11 18:38