0

我正在努力弄清楚如何使俯仰偏航和滚动在它们之间独立。一旦我在 z 轴(俯仰)上旋转某些东西,第二次旋转(yaxis yaw)取决于第一次旋转的结果,第三次旋转(x 轴,滚动)取决于其他两个旋转的结果。因此,我没有独立的俯仰、偏航、滚动,而是将它们三个混合在一起,很难看。

我希望可以将对象角度存储在数组 [pitch,yaw,roll] 中,然后在转换过程中解码这些角度,以便偏航将对象置于给定位置,然后采用与俯仰相对应的角度,但是不是两者的复合...

我已经看到对“任意轴旋转矩阵”的引用。得到想要的结果会有用吗???1) 应用偏航 (gl.glRotatef(beta, 0.0f, 1.0f, 0.0f);) 2) 获得手动旋转矢量 (1.0f,0.0f,0.0f) 围绕 beta 的结果轴 3) 应用俯仰使用轴进入 2 {和滚动...如果 1,2,3 是正确的} 4)旋转进入 2 的轴围绕其 x 滚动 5)使用进入 4 的轴应用滚动

它会起作用吗?有更好的解决方案吗?我想将我的对象本地方向保持为 [pitch,yaw,roll] 格式。

我已经为此苦苦挣扎了好几天,如果可能的话,我想避免使用四元数。3D 对象存储在相对于 0,0,0 并沿 {1,0,0} 观察并转换到它们的目的地和角度的每一帧,因此应该很容易避免云台锁定问题。

换句话说,我的相机工作正常,世界坐标正在正确制作,但我不知道应该如何或在何处应用基于偏航、髓、滚动的对象局部变换。

结果应从数组 [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);
4

3 回答 3

6

方向始终取决于角度顺序。你不能让他们独立。您旋转向量将它们乘以矩阵,并且矩阵乘法不是可交换的。您可以选择一个订单并与之保持一致。对于这些问题,常见的选择是 ZYX 定向方法(先滚动,然后俯仰,最后偏航)。当我使用角度时,我的个人参考是这个文档,它对我有很大帮助。

于 2012-08-05T20:14:34.570 回答
4

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

于 2012-08-05T20:59:49.507 回答
1

累积(偏航,俯仰,滚动)旋转需要按照它们发生的顺序保留一个变换矩阵,它是单独变换的乘积。生成的矩阵是围绕某个轴和某个角度的旋转。

于 2014-05-29T10:07:54.230 回答