Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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
C++ GLM矩阵中的旋转方向,使用四元数_C++_Opengl_Matrix_Quaternions_Glm Math - Fatal编程技术网

C++ GLM矩阵中的旋转方向,使用四元数

C++ GLM矩阵中的旋转方向,使用四元数,c++,opengl,matrix,quaternions,glm-math,C++,Opengl,Matrix,Quaternions,Glm Math,我正在进行一个3D渲染设置(所有的数学都是用GLM for OpenGL完成的),除了我希望我的转换如何工作之外,它都能正常工作。 我为每个实体创建一个矩阵,如下所示: matrix = mat4(1); vec3 scale = GetWorldScale(); vec3 pos = GetWorldPosition(); // Returns pos + parent->pos quat rot = GetWorldRotationQuat(); // Returns parent-&

我正在进行一个3D渲染设置(所有的数学都是用GLM for OpenGL完成的),除了我希望我的转换如何工作之外,它都能正常工作。 我为每个实体创建一个矩阵,如下所示:

matrix = mat4(1);
vec3 scale = GetWorldScale();
vec3 pos = GetWorldPosition(); // Returns pos + parent->pos
quat rot = GetWorldRotationQuat(); // Returns parent->rot * rot

matrix = glm::translate(matrix, pos);
matrix *= mat4_cast(rot);
matrix = glm::scale(matrix, scale);

right = matrix[0].xyz;
up = matrix[1].xyz;
direction = matrix[2].xyz;
使用这个,它通常工作正常,只是我不确定如何调整它的一部分以适应偏好。也就是说,使用此选项,X轴上的平移被翻转(例如,左轴为正,Z轴上的正向为正,但我不太区分),Y轴上的旋转被翻转

从其他代码来看,似乎很多代码否定了我在方向(相机)上使用的东西。我也这样做了,平移是正确的,但所有旋转轴都与首选轴相反(尽管X轴上的旋转是相同的,无论方向是否相反)


我不太确定我应该做些什么来帮助纠正这个问题,除了可能在使用前否定X轴平移和Y轴旋转,但我觉得这不是最好的方法。思考?

我相信问题来自于这样一个事实:你混合了变换的顺序,特别是平移和旋转。每个变换(缩放、平移和旋转)都定义了如何将一个坐标系转换为另一个坐标系

让我们看一个例子:有一个子对象c和它的父对象p。它们都有平移t、旋转r和缩放s。为了简单起见,每个矩阵都是4x4矩阵。你现在是

matrix = p.t * c.t * p.r * c.r * p.s * c.s
因此,想象由该矩阵变换的子对象的局部坐标系(长度为1的xyz轴)。点从右开始相乘,所以我们必须从右到左阅读。首先,坐标系由子坐标系缩放,然后由父坐标系缩放。然后它被孩子旋转。然后是父母。现在应用了孩子的翻译。这意味着在旋转坐标系中应用子平移。由于您已经应用了子对象的和父对象的旋转,因此它将旋转到父对象的坐标系中。因此,子对象的坐标被解释为父对象坐标

那么您应该做什么:在您的方法中,计算对象矩阵
m=c.t*c.r*c.s
。然后将对象的世界矩阵定义为
wm=pm*m
,其中父矩阵
pm
是父矩阵的世界矩阵。这样,您将得到一个世界矩阵:

c.wm = (c.pm) * (c.o) = (p.t * p.r * p.s) * (c.t * c.r * c.s)

这意味着孩子的平移在孩子的坐标系中,而家长的平移在家长的坐标系中。

好吧,你在两年内一次就比我更进一步了。这些方向的含义还不清楚。或者这些转变意味着什么。一般来说,世界没有旋转。加姆:我也可以在这里使用欧拉(eulers)(我还没有理解/见证四元数的优点,但它们是可用的)。妮可:我想我明白了,但你知道我的意思,每个轴的行为方式。请准确解释
GetWorldPosition()
GetWorldRotationQuat()函数的功能。显然有父母,所以我认为你可能把你的等级结构中的转换顺序搞砸了。他们会返回他们所说的。如果变换有父对象,
GetWorldPosition()
返回
parent->GetWorldPosition()+position
,如果没有父对象,则只返回
position
,并且
getworldprotationquat()
执行相同的操作,除了
parent->getworldprotationquat()*rotation
或者如果没有父对象,只返回
rotation
。我还有另一种方法,就是创建一个局部矩阵,然后乘以父矩阵的一个世界矩阵,同样有效。按照正确的顺序检索父级。