如何改变Yaw Angle /将Global eulerAngles放入本地空间

时间:2018-05-29 12:09:38

标签: unity3d math vector quaternions euler-angles

我正在进行飞机游戏,我需要在飞机的偏航中获得变化。

我正在尝试保存前一帧的transform.eulerAngles并将它们推回到变换的局部空间,以便我可以捕获变化。我正在尝试transform.InverseTransformXXXXX,但它似乎不起作用。

private float _GetChangeInYawAngle()
{
    float yaw = transform.InverseTransformDirection(m_lastForwardParented).y;
    yaw = yaw > 180 ? yaw - 360 : yaw;
    m_lastForward = transform.parent.eulerAngles;
    return yaw;
}

2 个答案:

答案 0 :(得分:0)

无需使用InverseTransformDirection,

float _lastYaw;
void Update()
{
  float thisYaw=transform.eulerAngles.y;
  float deltaYaw=thisYaw-_lastYaw;
 _lastYaw=thisYaw;
}

当然你还需要以某种方式处理0-360过境。

我可能误解了你想要在这里实现的目标,但如果你只是想跟踪最后一次旋转的当前旋转,那么eulerAngles和localEulerAngles之间的区别会自动处理你的本地空间转换

答案 1 :(得分:0)

@zambari

在查看你的答案后,我对转换四元数进行了一些研究。 您的解决方案的问题是" thisYaw-_lastYaw"没有被推到局部空间,因此y轴可以在帧之间疯狂地变化,因此计算出的差异可能比实际变化更大。将方程移动到局部空间可以解决这个问题,除非有非常高的角速度,这是我不需要解决的。 (在后面的网站上,我想我也可以使用角速度找到这个,但我离题了。)

这是我的工作解决方案!感谢您的投入。

private float _SetChangeInYawAngle()
{
    Quaternion LocalRotation = Quaternion.Inverse(m_lastYawRotation) * transform.rotation;

    float yaw = LocalRotation.eulerAngles.y;

    yaw = yaw > 180 ? yaw - 360 : yaw;

    m_currentAngle -= yaw;

    m_lastYawRotation = transform.rotation;

    return m_currentAngle;
}