从 glLookAt() 到 glRotatef() 和 gltranslatef
Posted
技术标签:
【中文标题】从 glLookAt() 到 glRotatef() 和 gltranslatef【英文标题】:from glLookAt() to glRotatef() and gltranslatef 【发布时间】:2014-04-29 16:22:25 【问题描述】:我需要将gluLookAt()
操作替换为glRotatef()
和glTranslatef()
操作。
我可以用gluLookAt(1,1,0,0,0,0,0,1,0);
做到这一点,但我只是猜到了一些数字,但我得到了相同的图片。
这背后的数学原理是什么?我怎样才能随机取一些gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upZ, upY, upZ)
并将其更改为旋转和平移并获得相同的图片?
【问题讨论】:
***.com/questions/13166135/how-does-glulookat-work 您必须找到 x-z 和 x-y 平面角度,并通过它们单独旋转矩阵。不要忘记首先通过其负位置 self 平移您的矩阵,以便它围绕自身旋转。之后你把它翻译回来。 @Cyber rotatef 上的 A 和 B 是什么?当我尝试使用 -eye 向量进行翻译时,我什至看不到对象 【参考方案1】:
gluLookAt (...)
设置视图空间的轴和原点。
在我看来,考虑每个单独的列代表什么比将这个操作转化为一系列平移和旋转要容易得多(即使从根本上来说就是这样)。
要设置视图空间的方向,gluLookAt (...)
基本上会计算各个轴。 没有任何意义它曾经处理任何欧拉角,如glRotatef (...)
需要你做。鉴于 gluLookAt (...)
产生的视图空间是正交的,因此仅从两个轴计算第三个轴是微不足道的。
然后将这三个轴存储在矩阵的第 1-3 列 X、Y、Z 中。
最后,由于查看变换除了旋转之外还有位置,因此相机的眼点存储在矩阵的第 4 列中。
考虑下图来自 Song Ho Ahn (안성호), OpenGL Transformation:
老实说,自己设置矩阵比处理欧拉角和glRotatef (...)
更方便。
【讨论】:
对于我的一生,我无法弄清楚为什么该图将 X 轴称为左。gluLookAt (...)
生成右手坐标系,+Z 指向观察者。 +X 因此是正确的,如果您查看实际的彩色轴,您甚至可以看到这一点。除了你所说的 X 轴之外,这张图应该会有所帮助。
感谢您的回答。但我仍然需要gluLookAt()
并将其转换为glRotate()
和glTranslate()
。如果答案在那里,请原谅我,但我在这个领域有点新……如果你能提供一个不那么复杂的答案,我会很高兴!提前谢谢
如果您认为答案很复杂,如果您使用glRotate (...)
和glTranslate (...)
,它会很多更复杂.因为那时您必须完成我刚才讨论的所有计算,并根据您已经拥有的 3 个向量计算旋转角度。没有理由让事情变得如此复杂。旋转存储在左上角的 3x3 子矩阵中,如果需要,您可以反向求解旋转角度(如图here),但这是浪费时间。【参考方案2】:
我同意 Andon 的观点,即找到整个矩阵要容易得多。但是如果你仍然需要找到分解为glRotate
和glTranslate
,那么你可以按照这些步骤,至少对于这个特定的设置。
我们需要找到一个转换,将 xyz 坐标系中的点表示转换为 x'y'z' 坐标系中的表示(不同于变换一个点)。这与将橙色系统与蓝色系统对齐相同。
关于这种转变,我们可以说两件事:
-
y'z'=Uz' 平面转换为 yz 平面。
z' 轴转换为 z 轴。
为了进行转换,我们执行以下操作:
-
将原点 E 平移到点 C。
绕 y' 轴顺时针旋转 90° 以满足条件 (2)。
绕 z=z' 轴顺时针旋转 45° 以满足条件 (1)。
可以总结为:
glRotatef(45, 0, 0, 1);
glRotatef(90, 0, 1, 0);
glTranslatef(-1, -1, 0);
【讨论】:
以上是关于从 glLookAt() 到 glRotatef() 和 gltranslatef的主要内容,如果未能解决你的问题,请参考以下文章