为什么相机向后移动相当于向前移动整个世界?

时间:2013-09-25 13:53:14

标签: opengl

Opengl superbible第4版。第164页

  

要应用相机变换,我们将相机的actor变换并将其翻转   向后移动相机相当于向前移动整个世界。同样的,   转向左边相当于将整个世界向右转。

我不明白为什么?

2 个答案:

答案 0 :(得分:3)

将自己放置在包含所有其他内容的Universe中。为了使您的视点看起来向前移动,您有两个选择...

  1. 你向前迈进。
  2. 您将宇宙中的其他所有内容向与1相反的方向移动。
  3. 因为你根据观察者在OpenGL中定义了所有内容(你最终渲染的是3D世界的特定视点的2D图像),所以从数学和编程的意义上来说,它通常更有意义。方法

答案 1 :(得分:2)

数学上只有一个正确的答案。定义为通过将eye-space位置乘以world-space转换为view-matrix后,生成的向量将相对于原点(相机在概念上相对位置的空间位置)进行解释到上述点)。

SuperBible表示在数学上只是在某个方向上否定翻译,这是使用计算view-matrix gluLookAt()的函数时自动获得的结果(尽管是GLU)是遗留GL内容的lib,数学上两者是相同的。)

查看glmLookAt()的API参考。您将看到第一步是设置gluLookAt()的正交法线基础,它首先产生一个4x4矩阵,基本上只编码上3x3旋转矩阵。第二个是将前一个矩阵乘以平移矩阵。就遗留功能而言,这可以表示为

eye-space

您可以看到,指定相机在glMultMatrixf(M); // where M encodes the eye-space basis glTranslated(-eyex, -eyey, -eyez); 中所处位置的向量(eyex, eyey, eyez)只需乘以world-space。现在假设我们根本不旋转相机,但假设它位于-1位置(5,5,5)。适当的视图矩阵world-space将是

[1 0 0 -5
 0 1 0 -5
 0 0 1 -5
 0 0 0 1]

现在采用由该矩阵转换的View顶点位置P =(0,0,0,1):world-spaceP' = View * P将只是P'

P'=(-5, -5, -5, 1)中思考时,相机位于world-space,顶点位于(5, 5, 5)。在(0, 0, 0)中思考时,相机位于eye-space,顶点位于(0, 0, 0)

总之:从概念上讲,这是一个关于你如何看待事物的问题。您可以将其视为相对于世界改变相机,或者您认为它相对于相机改变了世界。

在数学上,就OpenGL转换管道而言,只有一个答案,那就是:(-5, -5, -5)(或eye-spaceview-space)中的相机始终位于转换为camera-space的原点和world-space位置将始终相对于相机的坐标系。

编辑:只是为了澄清,虽然转换管道和涉及的矢量空间定义得很好,但您仍然可以使用所有内容的eye-space位置,甚至是相机,例如片段用于照明计算的着色器。这里重要的是知道从不混合来自不同空间的实体,例如不要根据world-space 以及world-space位置等计算内容。

EDIT2 :现在,在我们都使用着色器*咳嗽和滚动眼睛*的时代,你非常灵活,理论上你可以将你喜欢的任何位置传递给eye-space顶点着色器(或几何着色器曲面细分阶段)中。但是,由于后续计算是固定的,即剪切透视分割视口转换,如果结果位置不在内{{} {1}},gl_Position[-gl_Position.w, gl_Position.w]中的{1}}。

要想真正做到这一点还有很多。我建议您阅读GL官方维基中 rendering pipeline 上的整篇文章。

相关问题