[英]glMultMatrix/glLoadMatrix more efficient than glRotatef, or glTranslatef?
[英]from glLookAt() to glRotatef() and gltranslatef
我需要用glRotatef()
和glTranslatef()
操作替换gluLookAt()
。 我可以用gluLookAt(1,1,0,0,0,0,0,1,0);
做到这gluLookAt(1,1,0,0,0,0,0,1,0);
但我猜到了一些数字,我得到了同样的照片。
这背后的数学是什么? 我怎样才能采取一些随机的gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upZ, upY, upZ)
并将其更改为旋转并翻译并获得相同的图片?
gluLookAt (...)
设置视图空间的轴和原点。 在我看来,更容易考虑每个单独列所代表的内容,而不是将此操作转换为一系列翻译和轮换(尽管从根本上说就是这样)。
要设置视图空间的方向, gluLookAt (...)
基本上计算各个轴。 在任何时候 ,它曾经处理任何欧拉角像glRotatef (...)
会要求你做的。 鉴于视图空间gluLookAt (...)
产生的是正交的,仅从两个计算第三轴是微不足道的。
然后将这三个轴存储在矩阵X,Y,Z的列1-3中。
最后,由于观察变换除了旋转之外还有位置,因此摄像机的视点存储在矩阵的第4列中。
老实说,只是自己设置矩阵而不是处理Euler角度和glRotatef (...)
更方便。
我同意Andon的观点,即找到整个矩阵要容易得多。 但是如果你仍然需要找到glRotate
和glTranslate
的分解,那么你可以按照这些步骤进行操作,至少对于这个特定的设置。
我们需要找到一个转换,它将xyz坐标系中一个点的表示转换为它在x'y'z'坐标系中的表示(不同于转换一个点)。 这与将橙色系统与蓝色系统对齐相同。
关于这种转变我们可以说两件事:
要进行转换,我们执行以下操作:
这可以概括为:
glRotatef(45, 0, 0, 1);
glRotatef(90, 0, 1, 0);
glTranslatef(-1, -1, 0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.