我正在努力学习(现代) OpenGL,我对各种转变感到非常困惑。
观察矩阵让我困惑,所以我需要一些澄清。
以下是我对(常规)管道的理解。
总之..。
有什么解释吗?
发布于 2013-11-03 18:51:10
当呈现三角形时,顶点的坐标解释如下:
这就是为什么简单的例子在远平面上呈现一个可见的三角形。
现在让我们来看一下视图转换。该变换将由四个向量构造。(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坐标转换为正深度值.
发布于 2013-11-03 18:48:01
当使用虚拟相机时,通常定义一个眼空间。这个定义可以是任意性的,但是有一些普遍的约定(以及GL定义的旧矩阵堆栈,或者更倾向于某些约定)。为下列约定指定了gluLookAt:
您应该知道,在呈现时,world space并不重要。重要的是对象相对于虚拟摄像机/眼睛的相对位置(这也是为什么旧的GL矩阵堆栈有一个组合的ModelView矩阵,而不是Model和View转换的两个独立矩阵的原因)。使用一个放置所有物体的世界空间,并在该空间中指定一个虚拟相机,这是更直观的。这就是gluLookAt应该做的。如果你把view矩阵放在恒等式上,那就好像你的相机是在世界空间起源处,朝-z方向看一样。因此,为了获得将相机移动到某个指定的目点的效果,这与将世界空间中的所有物体朝相反方向移动一样。旋转也是如此。gluLookAt将设置一个旋转和一个平移。有关细节,请看一下gluLookAt。
https://stackoverflow.com/questions/19756415
复制相似问题