【问题标题】:Converting yaw Euler angles in range [-90, 90] to [0, 360]将 [-90, 90] 范围内的偏航欧拉角转换为 [0, 360]
【发布时间】:2012-06-22 23:50:55
【问题描述】:

是否可以使用子弹物理引擎转换偏航欧拉角

btTransform trans;
trans.getBasis().getEulerYPR(rx, ry, rz);

在 [0 , 360] 范围内。否则,对于 360 度旋转,我得到的欧拉角从 0->90->0-> -90 -> 0

变化

但我想要从 0->90->180->270->0

我的图形 API 只接受 0 到 360 度范围内的旋转角度


嗯,0->90->0-> -90 是音高值。这是我现在使用的代码:

trans.getBasis().getEulerYPR(yaw, pitch, roll);
y1 = (pitch >= 0) ? pitch : (PI2 + pitch);

我试图为音高的负值添加 180,但这不起作用。好吧,看来我需要找到另一种使用欧拉角平滑旋转网格的方法。


更新:看来我不应该直接使用项目符号功能。更好的选择是直接处理基矩阵:

btMatrix3x3 m_el = trans.getBasis();
ry = btAtan2( m_el[0].z(), m_el[0].x() );
if(ry < 0)
    ry += SIMD_PI;

所以这给了我关于 y 轴的旋转。现在关于另外 2 个 ....phew !

【问题讨论】:

标签: bulletphysics euler-angles


【解决方案1】:

不,请阅读不同角度或一般欧拉角的域。两个的域 [0, 2 pi] 通常是偏航和滚动,一个 [0, pi] 通常是俯仰。

【讨论】:

  • 所以我想如果我想单独使用欧拉角平滑旋转网格,那是不可能的。因为当欧拉角越过 90 并开始下降时,网格会向后旋转!奇怪的是,我得到的范围在 [-90, 90]
  • @safe-malloc 如果你想要平滑的旋转,我建议使用四元数。与欧拉角相反,四元数是 SO(3) 上的 2->1 映射,这意味着在域中没有会导致万向节锁定等副作用的极点。此外,interpolating 在两个方向之间旋转是直截了当的四元数。查看void btMatrix3x3::getRotation (btQuaternion &amp;q )const...btQuaternion btQuaternion::slerp(...) 已经实现...不错
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多