我正在尝试学习(现代)OpenGL,我对各种转换感到非常困惑......
查看矩阵让我感到困惑,所以我需要澄清一下。
以下是我对(传统)管道的理解。
现在,总结......
任何解释/指示?
答案 0 :(得分:1)
渲染三角形时,顶点的坐标解释如下:
这就是为什么你的简单例子在远处的平面上呈现一个可见的三角形。
现在让我们进入视图转换。转换将由四个向量构成。 (1,0,0)的图像,(0,1,0)的图像,(0,0,1)的图像和平移向量。但是,由于视图变换是逆变换,因此必须反转所得到的矩阵。
您的观点方向是center - eye
。然而,这不是我们对矩阵所需要的。我们需要(0,0,1)的图像。通常,OpenGL程序使用右手坐标系。在该系统中,相机看向负z方向。所以center - eye
实际上是(0,0,-1)的图像。然后,(0,0,1)的图像只是eye - center
。这就是你所需要的。
使用此定义,您还需要进行适当的投影转换。否则你只会看到相机后面的东西(因为那是z坐标为正的位置,因此具有正的深度值)。投影变换负责将负z坐标转换为正深度值。
答案 1 :(得分:0)
使用虚拟相机时,通常会定义眼睛空间。这个定义可以是任意的,但是有一些广泛的约定(GL的旧矩阵堆栈定义或偏好某些约定)。为以下约定指定了gluLookAt
:
您应该知道渲染时world space
并不重要。所有重要的是对象相对于虚拟相机/眼睛的相对位置(这也是旧GL矩阵堆栈具有组合ModelView
矩阵的原因,而不是Model
和{的两个单独矩阵的原因{1}} transfroms)。使用放置所有对象的世界空间并在该空间中指定虚拟摄像机更加直观。这就是View
应该做的事情。如果您将gluLookAt
矩阵留在Identity上,就好像您的相机位于世界空间原点,朝向-z方向。因此,为了获得将相机移动到某个指定视点的效果,它与在逆方向上移动该世界空间中的所有对象相同。轮换也是如此。 view
只会设置轮播和翻译。有关详细信息,请查看my previous answer about gluLookAt
。