Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 视图矩阵:反转旋转还是不反转旋转?_Math_Opengl_3d_Rotation - Fatal编程技术网

Math 视图矩阵:反转旋转还是不反转旋转?

Math 视图矩阵:反转旋转还是不反转旋转?,math,opengl,3d,rotation,Math,Opengl,3d,Rotation,编辑:我的问题可能太复杂,无法回答我真正的问题,所以请跳到TLDR;如果你需要的话 我已经为3D图形编程一段时间了,直到现在我似乎从来没有遇到过这个问题,但也许这是我第一次真正理解我应该或不应该做的事情。所以问题是 我的3D引擎使用典型的OpenGL遗留约定的RH坐标系,这意味着X+是正确的,Y+是向上的,Z+是朝向查看器的,Z-进入屏幕。我这样做是为了测试我的3D数学与OpenGL中的数学 为了配合Blender 3D/Collada的坐标约定,我在导入期间将每个矩阵沿X轴旋转-90度。如果我

编辑:我的问题可能太复杂,无法回答我真正的问题,所以请跳到TLDR;如果你需要的话

我已经为3D图形编程一段时间了,直到现在我似乎从来没有遇到过这个问题,但也许这是我第一次真正理解我应该或不应该做的事情。所以问题是

我的3D引擎使用典型的OpenGL遗留约定的RH坐标系,这意味着X+是正确的,Y+是向上的,Z+是朝向查看器的,Z-进入屏幕。我这样做是为了测试我的3D数学与OpenGL中的数学

为了配合Blender 3D/Collada的坐标约定,我在导入期间将每个矩阵沿X轴旋转-90度。如果我没弄错的话,科拉达使用X+右,Y+向前,Z+向上

当我只使用投影矩阵、同一视图矩阵和模型矩阵,将三角形变换为0,0,-5的位置时,我会看到它,因为Z-在屏幕上

在我的6自由度太空游戏中,我有宇宙飞船和小行星。我使用双精度坐标,因为它们非常大,通过将相机放在宇宙飞船中,坐标会相对于每一帧进行设置,因此它们的精度足以适合在GPU上渲染的单精度坐标

现在我有一艘宇宙飞船,相机在里面,它的旋转四元数是恒等式。这给出了一个单位矩阵,如果我没记错的话,第1-3行表示对象指向的X、Y和Z轴。为了移动飞船,我用这个Z轴前进。对于单位矩阵,Z轴将为0,0,1

编辑:实际上,我没有从矩阵中提取列,而是直接从四元数中提取轴

现在,当我把相机放在宇宙飞船上时,这意味着它的鼻子指向0,0,1,但是OpenGL会在屏幕上呈现-1,因为它的惯例

我总是听说,当你把相机放在场景中的一个对象中时,你需要获取模型矩阵并反转它。这是合乎逻辑的:如果飞船在0,0,1000,而小行星在0,0,1100,那么你需要将相机放置在0,0,-1000,这样飞船将在0,0,0,小行星将在0,0,100

所以当我这样做的时候,船的鼻子会看着Z-,但是现在,当我开始移动的时候,我的船会移动到它的旋转方向,仍然是Z为0,0,1,船会后退而不是前进。如果0,0,1朝向查看器,这是有意义的

所以现在我很困惑。。。我应该如何正确处理这个问题???我错误地使用了哪种约定?我忘记了哪个惯例?例如,在计算运动矢量时反转船舶的旋转似乎不合逻辑

有人能帮我澄清一下吗?这已经困扰了我一个星期了,我似乎没有理直气壮地承认我犯了新的错误

编辑:为视图矩阵反转模型矩阵的旋转部分不是很奇怪吗?我知道平移部分应该是倒置的,但视图在渲染时仍应与对象的方向相同,不是吗

TLDR; 如果您使用传统的OpenGL,设置标准投影矩阵和identity modelview矩阵,并在0,0,-5处渲染三角形,您将看到它,因为OpenGL查看的是Z-

但是,如果从视图矩阵第三行列中获取Z轴,即单位矩阵上的0、0、1,这意味着“向前”意味着将离三角形更远,这看起来不合逻辑

我错过了什么

编辑:由于答案隐藏在下面的许多评论中,我总结如下:约定!我选择使用OpenGL遗留约定,但我也选择使用我自己的物理约定,它们会发生冲突,所以我需要对此进行补偿


编辑:经过深思熟虑,我决定放弃OpenGL遗留约定,使用我认为最符合逻辑的系统,即左撇子系统。

我认为您困惑的根源可能在于此

现在我有一艘宇宙飞船,相机在里面,它的旋转四元数是恒等式。这给出了一个单位矩阵,如果我没记错的话,第1-3行表示对象指向的X、Y和Z轴。为了移动飞船,我用这个Z轴前进。对于单位矩阵,Z轴将为0,0,1

因为我们可以假设视图矩阵只包含旋转和平移,而不包含缩放/剪切或透视技巧,所以我们知道左上角的3x3子矩阵将只包含旋转,并且这些子矩阵根据定义是正交的,因此InverseMat3视图将是TransposeMat3视图,这是行的来源。因为在一个标准矩阵中,用于在固定坐标系中变换对象,而不是移动坐标系 在坐标系中,矩阵的列将简单地显示x、y和z的单位向量以及原点0,0,0,1将通过该矩阵映射到的位置。通过获取行,您可以使用转置,在这个特定的设置中,转置是相反的,当然,不考虑包含转换的最后一列

视图矩阵将从沃尔德空间转换为眼睛空间。因此,inverseview将从眼睛空间转换回世界空间

因此,inverseview*1,0,0,0将给出相机在世界空间中的右向量,inverseview*0,1,0,0将给出上向量,但按照惯例,相机将在眼睛空间中查看-z,因此Wold空间中的前进方向将是inverseview*0,0,-1,0,在您的设置中,这只是矩阵的第三行


摄像机位置将是inverseview*0,0,0,1,当然,但我们必须做的不仅仅是换位,以获得inverseview的第四列正确。

当船舶移动时,模型矩阵会发生变化。模型矩阵应用于视图矩阵之前。你必须独立于场景的视图来计算模型矩阵。我知道。这不是我的问题。我的问题是,为什么我的旋转告诉我当OpenGL将其渲染到Z时它指向Z+,以及如何正确处理这个问题为什么我的旋转告诉我它指向Z+,它如何告诉我?因为船的方向不对?这导致我的第一个评论,模型矩阵应用于视图矩阵之前。顶点的变换必须是clip_pos=投影*视图*模型*模型。当视点改变时,您必须改变视图。当模型的位置改变时,就必须改变模型。如果船向错误的方向移动,新模型变换会在视图后以某种方式应用。你没有正确阅读我的帖子,或者我完全误解了你:我的相机实际上总是在0,0,0,我的对象与它相关。我实际上只需要旋转或相机位移的视图矩阵。旋转指向Z+,因为数学是这样说的:从四元数计算的旋转矩阵的第三行是[0 0 1],当单位为时,这是基本数学。OpenGL legacy渲染为Z-当给定一个标识旋转时,符号会转到哪里?可能是,但这可能有点基于观点。这只是数学问题。所以如果我把你的答案和我帖子上的评论放在一起,可以安全地假设,因为OpenGL legacy通过对Z求反,将设备空间从左手变为右手投影空间,所以我需要将Z求反到其他所有东西中?看起来它解决了我的问题engine@scippie:否。投影矩阵与此无关。一个经典的GL投影矩阵也遵循视线空间中的lookat is-z惯例,但这些都与你的问题无关。\n哦,但我的帖子有点问题:我一直在谈论行,但那只是说我知道通常如何从矩阵中获取轴,当然应该是列,但是我直接从四元数得到轴,所以这一点都不重要。我理解关于倒数和转置的部分。我仍然不明白为什么我需要对z求反以获得对象的前进方向,而当从摄影机看到相同的旋转矩阵时,没有求反的z以正确的方向渲染对象。我更新了OP以纠正行/列混淆。很抱歉。@Scipie:我真的不知道你现在的困惑在哪里。仍然不明白为什么我需要对z求反,以获得对象的前进方向,当相同的旋转矩阵no-negated z以正确的方向渲染对象时,这只是因为你想象对于你的对象,+z朝向前面,而对于相机,-z朝向前面。这两种都是你或多或少随意选择的惯例。