对openGL的摄影机和摄影机空间转换的困惑

问题描述 投票:1回答:2

[指定model-view转换时,我们需要三个向量来定义相机的局部轴,即direction vector(相机指向的地方),up vector和相机的right vector,在这三个轴上,direction vector是相机的本地Z轴。

[The author at learnopengl.com mentions,在本节的相机方向单位:

对于视图矩阵的坐标系,我们希望其z轴为正,并且由于默认情况下(在OpenGL中,相机指向负z轴],我们希望取反方向向量。

因此,我的问题是:

  1. 我们制定视图矩阵并明确应用转换在着色器中(传递视图矩阵或lookAt矩阵)为制服,所以不是我们创建的相机吗?这与OpenGL不同为我们提供了默认的相机对象供我们使用<<< [默认相机甚至来自?我们可以假设轴指向任何方向的坐标空间正确吗?
c++ opengl camera transformation
2个回答
2
投票
我们制定视图矩阵并明确应用转换在着色器中(均匀地传递视图矩阵或lookAt矩阵),那不是我们创造的相机吗?
是的,完全是。甚至在着色器出现之前也是如此。如果我们将其解释为完全由我们决定的“相机”,则只有坐标转换。

这不像OpenGL为我们提供了默认的相机对象一起使用,那么这个默认相机是怎么来的呢?

该教程在这里非常不精确。但是,在旧版OpenGL中有一些默认的

conventions,但这只是约定,绝不严格要求使用。一些旧版OpenGL功能是使用这些功能设计的不过请记住惯例。通常的想法是,用户使用左眼空间,其中x指向右侧,y向上,并且z在屏幕外朝向观看者,因此-z是注视方向。旧的gluLookat()函数遵循以下约定。

[还有用于创建投影矩阵的旧函数也遵循这一点:glFrustum()glOrtho()gluPerspecitve()都将nearfar设为视线方向的正距离,但在近处使用z_eye = -near平面,z_eye = -far表示远平面。他们还将下一行设置为0,0,-1,0,因此我们最终用-z_eye进行了永久除法,并以此获得右手NDC坐标系(z_ndc现在指向屏幕)。

请注意,glm中的矩阵函数也被建模为遵循这些约定,但是您还会发现以名称LHRH为后缀的函数,因此您可以选择自己喜欢的约定。

我们可以假设坐标空间的轴指向任何方向吗?

是。但是,

clip space(gl_Position顶点着色器输出所在的位置)是由GL定义的:光栅化器将始终使用从x派生的x_cip/w_clip和从y派生的y_clip/w_clipx为水平,y为垂直尺寸。 z尺寸仅用于深度测试,并且如果它指向屏幕,我们最终会再次选择它(您可以切换深度测试比较方向或glDepthRange,或同时切换两者)。 GPU根本不在乎您之间使用的内容,因此对于

object space,world space和_eye_space_,您可以使用任何喜欢的约定,或者可以根据需要组成完全不同的空格需要比传统模型更好的东西。


1
投票
规范化的设备空间是左手系统(分别参见Perspective divideLeft- vs. Right-handed coordinate systems)。通常,我们要使用右手系统。因此,必须在某些时候将坐标系从右手系统转换为左手系统。通常,这是由投影矩阵完成的,该投影矩阵会反转(镜像)Z轴。

无论如何,绝对没有必要

“默认情况下(在OpenGL中,相机指向负z轴”]。这是规格问题,但通常使用类似的视图坐标系。


详见Right-hand rule


0
投票
规范化的设备空间是左手系统(分别参见Perspective divideLeft- vs. Right-handed coordinate systems)。通常,我们希望使用紧手系统。因此,必须在某些时候将坐标系从右手系统转换为左手系统。通常,这是由投影矩阵完成的,该投影矩阵会反转(镜像)Z轴。
© www.soinside.com 2019 - 2024. All rights reserved.