【问题标题】:pitch yaw roll, angle independency俯仰偏航滚动,角度独立
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @Danielle Lupo 感谢您的文档,看起来很棒。我只是想模拟飞机的运动,就好像它是从驾驶舱控制的,而不是从外面控制的。想象一下我做了一个循环 while(true){ incement_yaw(1); increment_pitch(1);} 然后我想得到一个连续旋转的“地板”飞机,它不断地循环“空中”,而不是两者的混合。那可能吗?由于使用欧拉角(万向节锁),我的“混合”结果是否? 四元数能解决我的问题吗?
    • 是的,四元数在这里有帮助,但并不是那么简单。首先,试试你的方法,看看会发生什么。你会发现它看起来不太对劲,不是很物理。有几件事需要考虑:平面的绝对位置和方向(相对于地面),以及线速度和角速度。欧拉角是表示方向的错误选择,但在谈论对方向或角速度进行小幅调整时,欧拉角更有意义。
    • 这种情况下的问题不在于四元数与矩阵(欧拉角肯定是错误的),而是您如何为平面建模。在您的情况下,您可能希望忽略角速度,因此矩阵与四元数一样有效。矩阵也可能更容易可视化(列是右/前/上向量,具体取决于您选择的坐标系)。
    • 四元数在微积分中比矩阵更快,并且更直观,因为您可以将三个旋转角度与一个数学实体相关联,并且可以通过四元数乘法来旋转它们。它们对于旋转插值 (slerp) 也很有用。但是它们从旋转角度的构造也取决于坐标系。在文献中广泛使用 ZYX 约定的构造,所以要小心。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多