繁体   English   中英

从glLookAt()到glRotatef()和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 (...)产生的是正交的,仅从两个计算第三轴是微不足道的。

  • Z轴(向前)被计算为从眼睛xyz到中心xyz的方向
  • Y轴(上)被直接给出XYZ
  • X轴(右)被计算为向上和向前矢量之间的

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

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

请考虑以下来自Song Ho Ahn(안성호), OpenGL Transformation的图表:

轴图

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

我同意Andon的观点,即找到整个矩阵要容易得多。 但是如果你仍然需要找到glRotateglTranslate的分解,那么你可以按照这些步骤进行操作,至少对于这个特定的设置。

图形设置

我们需要找到一个转换,它将xyz坐标系中一个点的表示转换为它在x'y'z'坐标系中的表示(不同于转换一个点)。 这与将橙色系统与蓝色系统对齐相同。

关于这种转变我们可以说两件事:

  1. y'z'= Uz'平面被转换为yz平面。
  2. z'轴转换为z轴。

要进行转换,我们执行以下操作:

  1. 将原点E转换为C点。
  2. 顺时针旋转y'轴90°以满足条件(2)。
  3. 顺时针旋转z = z'轴45°以满足条件(1)。

这可以概括为:

glRotatef(45, 0, 0, 1);
glRotatef(90, 0, 1, 0);
glTranslatef(-1, -1, 0);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM