我正在努力弄清楚如何使它们之间的俯仰偏转和滚动独立。 一旦我在z轴上旋转一些东西(俯仰),第二次旋转(yaxis yaw)取决于第一次和第三次旋转(x轴,滚动)的结果取决于另外两次。因此,我没有独立的音高,偏航,滚动,而是混合了三个,丑陋。
我希望可以将对象角度存储在数组[俯仰,偏航,滚动]中,然后在变换过程中对这些角度进行解码,以便偏航将对象置于给定位置,然后采用与之对应的角度音调,但不是两者的复合......
我见过对'任意轴旋转矩阵'的引用。获得理想的结果会有用吗??? 1)应用偏航(gl.glRotatef(beta,0.0f,1.0f,0.0f);) 2)得到手动旋转矢量(1.0f,0.0f,0.0f)arround beta的结果轴 3)使用2中的轴来应用音高 {和滚动......如果1,2,3是正确的} 4)将轴旋转到2周围x轴进行滚动 5)使用4轴进行滚动
它会起作用吗?更好的解决方案?我想保持我的对象局部方向为[俯仰,偏航,滚动]格式。
我已经挣扎了几天,如果可能的话,我想避免使用四元数。 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);
答案 0 :(得分:6)
方向总是取决于角度顺序。你不能让他们独立。旋转矢量将它们乘以矩阵,矩阵乘法不是可交换的。您可以选择一个订单并与之保持一致。 对于这些问题,常见的选择是ZYX定向方法(第一次滚动,然后是俯仰和最后的偏航)。 我使用角度时的个人参考是this document,这对我有很大帮助。
答案 1 :(得分:4)
如果您使用偏航/俯仰/滚动,您的最终方向将始终取决于您应用它们的数量和顺序。如果您想要可读性或简单性,可以选择其他方案。我喜欢选择一个前向矢量(F),并根据规范的“向上世界”向量计算一个向右和向上的向量,然后只填写矩阵列。如果您愿意,可以添加额外的“轴旋转”角度项。它有点像四元数,但更具人性化。我使用这种表示来控制基本的WASD风格的相机。
答案 2 :(得分:1)
累积(偏航,俯仰,滚转)旋转需要保持变换矩阵,它是单独变换的乘积,按它们出现的顺序。得到的矩阵围绕某个轴和一些角度旋转。