C++ openGL相机与相机空间变换的混淆

C++ openGL相机与相机空间变换的混淆,c++,opengl,camera,transformation,C++,Opengl,Camera,Transformation,在指定模型视图变换时,我们需要三个向量来定义摄影机的局部轴、方向向量(摄影机指向的位置)、上方向向量和摄影机的右方向向量,在这三个轴中,方向向量是摄影机的局部Z轴 在本节的摄影机方向单元中: 对于视图矩阵的坐标系,我们希望其z轴为正,因为在OpenGL中默认情况下,相机指向负z轴,我们希望方向向量为负 因此,我的问题是: 我们制定了视图矩阵,并明确应用了转换 在着色器中,将视图矩阵或注视矩阵作为 制服,那么相机不是我们创造的吗?它不像OpenGL 为我们提供了一个默认的摄影机对象供我们使用,那么

在指定模型视图变换时,我们需要三个向量来定义摄影机的局部轴、方向向量(摄影机指向的位置)、上方向向量和摄影机的右方向向量,在这三个轴中,方向向量是摄影机的局部Z轴

在本节的摄影机方向单元中:

对于视图矩阵的坐标系,我们希望其z轴为正,因为在OpenGL中默认情况下,相机指向负z轴,我们希望方向向量为负

因此,我的问题是:

我们制定了视图矩阵,并明确应用了转换 在着色器中,将视图矩阵或注视矩阵作为 制服,那么相机不是我们创造的吗?它不像OpenGL 为我们提供了一个默认的摄影机对象供我们使用,那么如何 这个默认相机是从哪里来的?我们可以假设轴心 我们的坐标空间指向任何方向,对吗? 我们制定了视图矩阵,并明确应用了转换 在着色器中,将“视图矩阵”或“注视矩阵”作为统一的, 那么,这架相机不是我们创造的吗

是的,没错。甚至在着色器出现之前也是如此。只有坐标变换,如果我们把它理解为照相机完全取决于我们

它不像OpenGL为我们提供了默认的相机对象 使用,那么这个默认相机是如何产生的呢

那个教程在这里是相当不精确的。然而,在传统的OpenGL中有一些默认约定,但这些只是约定,从来没有严格要求使用。一些遗留的OpenGL函数就是用这些函数设计的 不过,这是一种习俗。一般的想法是,用户使用右手眼空间,其中x指向右侧,y向上,z在屏幕外朝向观众,因此-z是注视方向。旧的gluLookat函数遵循这些约定

创建投影矩阵的旧函数也遵循这一点:glFrustum、glOrtho、GLUPPERSPECTVE都将近距离和远距离作为观察方向的正距离,但分别使用z_eye=-near表示近平面,使用z_eye=-far表示远平面。他们还将下一行设置为0,0,-1,0,所以我们最后做了人格除以-z_眼睛,得到了左手的NDC坐标系,z_NDC现在指向屏幕的坐标系

请注意,glm中的矩阵函数也是按照这些约定建模的,但您也会发现函数后缀名为LH和RH,因此您可以选择您喜欢的约定

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

对。但是,gl_位置顶点着色器输出所在的剪辑空间由gl定义:光栅化器将始终使用从x_cip/w_剪辑导出的x和从y_剪辑/w_剪辑导出的y,x为水平,y为垂直尺寸。z维度仅用于深度测试,如果该维度指向屏幕,则最终您可以再次选择退出该维度,您可以切换深度测试比较方向,或GLDEPTRANGE,或两者兼而有之。GPU根本不在乎你在它们之间使用什么,因此对于对象空间、世界空间和_eye_space u,你可以使用你喜欢的任何约定,或者你可以组成完全不同的空间,如果这比传统模型更适合你的需要

我们制定了视图矩阵,并明确应用了转换 在着色器中,将“视图矩阵”或“注视矩阵”作为统一的, 那么,这架相机不是我们创造的吗

是的,没错。甚至在着色器出现之前也是如此。只有坐标变换,如果我们把它理解为照相机完全取决于我们

它不像OpenGL为我们提供了默认的相机对象 使用,那么这个默认相机是如何产生的呢

那个教程在这里是相当不精确的。然而,在传统的OpenGL中有一些默认约定,但这些只是约定,从来没有严格要求使用。一些遗留的OpenGL函数就是用这些函数设计的 不过,这是一种习俗。一般的想法是,用户使用右手眼空间,其中x指向右侧,y向上,z在屏幕外朝向观众,因此-z是注视方向。旧的gluLookat函数遵循这些约定

创建投影矩阵的旧函数也遵循这一点:glFrustum、glOrtho、GLUPPERSPECTVE都将近距离和远距离作为观察方向的正距离,但分别使用z_eye=-near表示近平面,使用z_eye=-far表示远平面。他们还将下一行设置为0,0,-1,0,所以我们最后做了人格除以-z_眼睛,得到了左手的NDC坐标系,z_NDC现在指向屏幕的坐标系

请注意,glm中的矩阵函数也是按照这些约定建模的,但您也会发现函数后缀名为LH和RH,因此您可以选择您喜欢的约定

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


对。但是,gl_位置顶点着色器输出所在的剪辑空间由gl定义:光栅化器将始终使用从x_cip/w_剪辑导出的x和从y_剪辑/w_剪辑导出的y,x为水平,y为垂直尺寸。z维度仅用于深度测试,如果该维度指向屏幕,则最终您可以再次选择退出该维度,您可以切换深度测试比较方向,或GLDEPTRANGE,或两者兼而有之。GPU根本不在乎你在两者之间使用什么,因此对于对象空间、世界空间和_eye_space uu,你可以使用你喜欢的任何约定,或者,如果比传统模型更适合您的需要,您也可以组成完全不同的空间。

最后,三维标准化设备空间中的所有内容都会投影到二维视口中。规范化的设备空间是一个立方体,左、下、近为-1、-1,右、上、远为1、1、1。 所有将顶点坐标转换为clipspace坐标的转换都由您决定。 标准化设备坐标是剪辑空间坐标除以剪辑坐标的w分量。这叫做

标准化设备空间是左手系统,请参见。通常我们想要使用右手系统。因此,在某个时刻,cooridantes必须从右手系统转变为左手系统。通常,这是由投影矩阵完成的,投影矩阵反转镜像Z轴

无论如何,在OpenGL中,默认情况下相机指向负z轴是绝对没有必要的。这是一个规范问题,但通常使用这样的视图坐标系

进一步看

最后,三维标准化设备空间中的所有内容都投影到二维视口中。规范化的设备空间是一个立方体,左、下、近为-1、-1,右、上、远为1、1、1。 所有将顶点坐标转换为clipspace坐标的转换都由您决定。 标准化设备坐标是剪辑空间坐标除以剪辑坐标的w分量。这叫做

标准化设备空间是左手系统,请参见。通常我们想要使用右手系统。因此,在某个时刻,cooridantes必须从右手系统转变为左手系统。通常,这是由投影矩阵完成的,投影矩阵反转镜像Z轴

无论如何,在OpenGL中,默认情况下相机指向负z轴是绝对没有必要的。这是一个规范问题,但通常使用这样的视图坐标系

进一步看

尝试在Web上查找左手/右手坐标系尝试在Web上查找左手/右手坐标系如果我们不否定视图矩阵的z轴,结果会完全相同吗?我的意思是,如果轴向右翻转,人们会认为相机会远离目标?那么,如果我们没有否定视图矩阵的z轴,结果会完全相同吗?我的意思是,如果轴向右翻转,人们会认为相机会远离目标?那么,如果我们没有否定视图矩阵的z轴,结果会完全相同吗?我的意思是,如果轴向右翻转,人们会期望相机远离目标?如果你翻转你的眼睛空间z并相应地调整投影矩阵,最终结果将是相同的,是的。-z是注视方向,如果是右手,则意味着视图空间,你提到它是左手handed@juztcode是的,你是对的,我在描述中混淆了左手和右手,现在修复了这个问题。然而,你不能从-z作为注视方向来推断利手。可以将摄影机定义为在右手空间和左手空间中查看0,0,-1。您还可以将眼睛空间定义为相机/眼睛放置在1349,-0.125,sqrt2处,注视-pi,e,1/3方向。这只是一个约定,这个空间的惯用手是另一个约定。那么,如果我们不否定视图矩阵的z轴,结果会完全相同吗?我的意思是,如果轴向右翻转,人们会期望相机远离目标?如果你翻转你的眼睛空间z并相应地调整投影矩阵,最终结果将是相同的,是的。-z是注视方向,如果是右手,则意味着视图空间,你提到它是左手handed@juztcode是的,你是对的,我搞混了 我描述中的左撇子和右撇子,现在解决了这个问题。然而,你不能从-z作为注视方向来推断利手。可以将摄影机定义为在右手空间和左手空间中查看0,0,-1。您还可以将眼睛空间定义为相机/眼睛放置在1349,-0.125,sqrt2处,注视-pi,e,1/3方向。这将只是一个惯例,而这一领域的惯用手将是另一个惯例。