Opengl superbible第4版。第164页
要应用相机变换,我们将相机的actor变换并将其翻转 向后移动相机相当于向前移动整个世界。同样的, 转向左边相当于将整个世界向右转。
我不明白为什么?
答案 0 :(得分:3)
将自己放置在包含所有其他内容的Universe中。为了使您的视点看起来向前移动,您有两个选择...
因为你根据观察者在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-space
。 P' = 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-space
或view-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 上的整篇文章。