我正在进行飞机游戏,我需要在飞机的偏航中获得变化。
我正在尝试保存前一帧的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;
}
答案 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;
}