【问题标题】:How to get change in Yaw Angle / Put Global eulerAngles into Local space如何改变偏航角/将全局 eulerAngles 放入本地空间
【发布时间】:2018-05-29 12:09:38
【问题描述】:

我正在制作一个飞机游戏,我需要改变飞机的偏航角。

我正在尝试保存前一帧的 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;
}

【问题讨论】:

  • 您需要澄清您的意思 - 飞机的偏航通常是机头指向左侧或右侧相对于飞机框架的速度(即您使用相同数量的方向舵纠正给定的偏航,而不管滚动或俯仰),您的代码中都没有提到。我们不知道变换或前进是平面到世界还是速度到世界或平面到速度。

标签: unity3d math vector quaternions euler-angles


【解决方案1】:

不需要使用InverseTransformDirection,

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

当然,你仍然需要以某种方式处理 0-360 交叉。

我可能误解了您在此处尝试实现的目标,但如果您只是尝试跟踪当前旋转与上次旋转,那么 eulerAngles 和 localEulerAngles 之间的差异会自动处理您的本地世界空间转换

【讨论】:

    【解决方案2】:

    @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;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2017-12-20
      • 1970-01-01
      • 2016-08-19
      • 2020-01-09
      • 2017-11-02
      • 1970-01-01
      • 2016-05-02
      • 1970-01-01
      相关资源
      最近更新 更多