从glLookAt()到glRotatef()和gltranslatef

时间:2014-04-29 16:22:25

标签: c++ opengl 3d rotation

我需要用gluLookAt()glRotatef()操作替换glTranslatef()操作。 我想用gluLookAt(1,1,0,0,0,0,0,1,0);做到这一点,但我猜到了一些数字,但我得到了相同的图片。

背后的数学是什么?我该如何随机gluLookAt(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upZ, upY, upZ)并将其更改为旋转和翻译并获得相同的图片?

2 个答案:

答案 0 :(得分:2)

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

在我看来,更容易考虑每个列所代表的内容,而不是将此操作转换为一系列翻译和轮换(尽管从根本上说就是这样)。

要设置视图空间的方向,gluLookAt (...)基本上计算各个轴。在 没有点 的情况下永远处理像glRotatef (...)这样的欧拉角度需要你做的事情。鉴于视图空间gluLookAt (...)产生的是正交的,仅从两个计算第三个轴是微不足道的。

  • Z轴(向前)计算为从eye xyz 到center xyz 的方向
  • Y轴(向上) 给予 直接作为向上 xyz
  • X轴(右)计算为向上和向前矢量之间的 叉积

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

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

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

Axes Diagram http://www.songho.ca/opengl/files/gl_anglestoaxes01.png

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

答案 1 :(得分:0)

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

Graphical setting

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

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

  1. y'z'= Uz'平面转换为 yz 平面。
  2. z'轴转换为 z 轴。
  3. 要进行转换,我们会执行以下操作:

    1. 将原点 E 翻译为指向 C
    2. 顺时针旋转 y'轴90°以符合条件(2)。
    3. 顺时针旋转 z = z'轴45°以满足条件(1)。
    4. 这可以概括为:

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