【发布时间】:2015-04-02 18:03:18
【问题描述】:
我有一个非常简单的飞机模型,它可以在 x 和 y 方向上四处移动,而海洋会滚动以使其看起来好像飞机在飞行。每当飞机移动时,我都会调整它的滚动和俯仰。
我在对象脚本中计算并维护位置、滚动和俯仰。每个更新步骤我都会将它们重新分配给对象的 Unity 属性。
问题出现在我尝试添加滚桶效果的地方。此代码工作正常:
transform.Translate(position - transform.position);
Vector3 rotChange = new Vector3 (-pitch, 0, -roll) -
transform.rotation.eulerAngles;
transform.Rotate (rotChange);
只要我将所有旋转保持在 +- 30 度以内。当飞机进行滚桶滚动时,它会使用以下内容更新每个步骤:
velocity = new Vector3 (barrelRollDirections.x * barrelRollXSpeed,
barrelRollDirections.y * barrelRollYSpeed, 0);
roll += barrelRollTurnSpeed * Time.deltaTime;
if (roll < -(fullRotation/2)) {
roll += fullRotation;
}
if (roll > (fullRotation/2)) {
roll -= fullRotation;
}
有趣的是,如果我在旋转时飞机没有沿 x 或 y 轴移动,那么旋转飞机实际上可以正常工作。但如果是,它会到处跳跃,只有在滚动结束后才会重新出现在正确的最终位置。
我尝试了多种方法来解决这个问题:
-使用 Quaternion.Euler 将我想要的方向转换为四元数并将其直接分配给 transform.rotate。这并没有解决任何问题,而且还会导致飞机在其运动范围内抖动和摇晃。
-将平面的初始方向保存在四元数中,然后,在每个更新步骤中,将初始旋转重新分配给平面,然后调用 Transform.Rotate(new Vector3(-pitch,0,-roll))。我认为如果它是万向节锁之类的东西,这将解决我的问题,从那时起,我只会在每一步都应用小于 180 度的旋转。但没有骰子。
【问题讨论】: