opengl 俯仰、偏航、滚转、Angular 独立性

n3h0vuf2  于 2023-06-05  发布在  Angular
关注(0)|答案(3)|浏览(350)

我正在努力想办法使俯仰、偏航和滚转在它们之间独立。只要我在z轴上旋转某个东西(俯仰),第二次旋转(y轴偏航)就取决于第一次旋转的结果,第三次旋转(x轴,滚动)取决于其他两次。因此,而不是有独立的俯仰,偏航,滚动我得到了他们三个的混合物,丑陋。
我希望有可能将对象Angular 存储在数组[俯仰,偏航,滚动]中,然后在变换过程中解码这些Angular ,以便偏航将对象置于给定位置,然后取与俯仰对应的Angular ,但不是两者的复合......
我看到过关于“任意轴旋转矩阵”的参考文献。是否有助于获得预期的结果???1)应用偏航(gl.glRotatef(beta,0.0f,1.0f,0.0f); 2)获得围绕β手动旋转矢量(1.0f,0.0f,0.0f)的所得轴3)使用在2中获得的轴应用俯仰{并且对于滚转...如果1、2、3正确} 4)围绕辊的x旋转2中得到的轴5)使用4中得到的轴施加辊
会有用吗?有更好的解决办法吗?我想将对象的局部方向保持为[pitch,yaw,roll]格式。
我已经挣扎了好几天了,如果可能的话,我想避免使用四元数。3D对象相对于0,0,0存储,并沿着{1,0,0}查看,并转换到它们的目的地和每帧的Angular ,因此万向节锁定问题应该很容易避免。
换句话说,我的相机工作得很好,世界坐标正在正确地制作,但我不知道如何或在哪里应用基于yaw,pith,roll的对象局部变换。
结果应该从数组[y,p,r]中读取,并且它们的组合不应该重叠
其实我的转变是:

gl.glLoadIdentity(); 
float[] scalation = transform.getScalation();
gl.glScalef(scalation[0], scalation[1], scalation[2]); 
float[] translation = transform.getTranslation();
gl.glTranslatef(translation[0], translation[1], translation[2]);
float[] rotation = transform.getRotation();
gl.glRotatef(rotation[0], 1.0f, 0.0f, 0.0f);
gl.glRotatef(rotation[1], 0.0f, 1.0f, 0.0f);
gl.glRotatef(rotation[2], 0.0f, 0.0f, 1.0f);
thigvfpy

thigvfpy1#

方向总是取决于Angular 顺序。你不能让他们独立。你旋转向量乘以矩阵,矩阵乘法不是可交换的。你可以选择一个顺序,并与它保持一致。对于这些问题,通常的选择是ZYX定向方法(首先滚动,然后俯仰,最后偏航)。当我使用Angular 时,我的个人参考是this document,这对我帮助很大。
编辑:
我发现实际上链接是不正确的。我使用的文档的工作链接如下:
Representing Attitude: Euler Angles, Unit Quaternions, and Rotation Vectors

vc9ivgsu

vc9ivgsu2#

如果你使用偏航/俯仰/滚转,你的最终方向将总是取决于你应用它们的数量和顺序。如果你想要可读性或简单性,你可以选择其他方案。我喜欢选择一个前向向量(F),并根据一个规范的“世界上”向量计算一个右向量和上向量,然后只填写矩阵列。如果你愿意,你可以添加一个额外的“轴旋转”Angular 项。它有点像四元数,但更易于阅读。我使用这种表示来控制一个基本的WASD风格的相机。

5m1hhzi4

5m1hhzi43#

累积(偏航、俯仰、滚动)旋转需要保持变换矩阵,该变换矩阵是单独变换的乘积,以它们发生的顺序。得到的矩阵是围绕某个轴和某个Angular 的旋转。

相关问题