[指定model-view
转换时,我们需要三个向量来定义相机的局部轴,即direction vector
(相机指向的地方),up vector
和相机的right vector
,在这三个轴上,direction vector
是相机的本地Z轴。
[The author at learnopengl.com mentions,在本节的相机方向单位:
对于视图矩阵的坐标系,我们希望其z轴为正,并且由于默认情况下(在OpenGL中,相机指向负z轴],我们希望取反方向向量。
因此,我的问题是:
是的,完全是。甚至在着色器出现之前也是如此。如果我们将其解释为完全由我们决定的“相机”,则只有坐标转换。这不像OpenGL为我们提供了默认的相机对象一起使用,那么这个默认相机是怎么来的呢?
该教程在这里非常不精确。但是,在旧版OpenGL中有一些默认的conventions,但这只是约定,绝不严格要求使用。一些旧版OpenGL功能是使用这些功能设计的不过请记住惯例。通常的想法是,用户使用左眼空间,其中x指向右侧,y向上,并且z在屏幕外朝向观看者,因此
-z
是注视方向。旧的gluLookat()
函数遵循以下约定。[还有用于创建投影矩阵的旧函数也遵循这一点:
请注意,glFrustum()
,glOrtho()
,gluPerspecitve()
都将near
和far
设为视线方向的正距离,但在近处使用z_eye = -near
平面,z_eye = -far
表示远平面。他们还将下一行设置为0,0,-1,0
,因此我们最终用-z_eye
进行了永久除法,并以此获得右手NDC坐标系(z_ndc
现在指向屏幕)。glm
中的矩阵函数也被建模为遵循这些约定,但是您还会发现以名称LH
和RH
为后缀的函数,因此您可以选择自己喜欢的约定。我们可以假设坐标空间的轴指向任何方向吗?
是。但是,clip space(
gl_Position
顶点着色器输出所在的位置)是由GL定义的:光栅化器将始终使用从x
派生的x_cip/w_clip
和从y
派生的y_clip/w_clip
,x
为水平,y
为垂直尺寸。z
尺寸仅用于深度测试,并且如果它指向屏幕,我们最终会再次选择它(您可以切换深度测试比较方向或glDepthRange
,或同时切换两者)。 GPU根本不在乎您之间使用的内容,因此对于object space,world space和_eye_space_,您可以使用任何喜欢的约定,或者可以根据需要组成完全不同的空格需要比传统模型更好的东西。
无论如何,绝对没有必要
“默认情况下(在OpenGL中,相机指向负z轴”]。这是规格问题,但通常使用类似的视图坐标系。