【发布时间】:2012-08-02 21:56:32
【问题描述】:
我正在努力弄清楚如何使俯仰偏航和滚动在它们之间独立。 一旦我在 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}看,每帧都转换到它们的目的地和角度,所以应该很容易避免云台锁定问题。
换句话说,我的相机工作正常,世界坐标已正确生成,但我不知道应该如何或在何处应用基于 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);
【问题讨论】:
-
为什么要避免四元数?
-
“我想将我的对象本地方向保持为 [pitch,yaw,roll] 格式。”为什么?为什么要打折问题的实际解决方案(即:四元数)?
-
我想让代码尽可能简单,四元数可能会增加复杂性。试图弄清楚基于四元数的代码在实际代码中的位置,并且怀疑它们是否应该伴随或替换实际的轮换代码使我试图避免它们,我找到的文档说明了它们在数学上是如何工作的,但没有给出它们在已经完成的基于欧拉的代码中的位置的任何示例。旋转已经足够复杂了,有时很难排除哪些错误是由于角度造成的,哪些是由于实施错误造成的。
标签: c++ opengl transformation jogl angle