Unity3D将旋转存储在一个非常抽象的数学表示中,称为quaternion。从欧拉角到欧拉角的转换(你在Unity编辑器中看到的)涉及三角函数的级联,因此容易出现舍入误差,尤其是对于简单的浮点类型。
为了解决您的问题,我建议在开始旋转之前存储初始Quaternion对象,并在流程结束时将其设置。一些伪代码:
public class RotationController : MonoBehaviour {
Quaternion rotationAtStart;
int numOfRotations = 0;
void rotate() {
numOfRotations++;
if (numOfRotations == 1) {
rotationAtStart = transform.rotation;
} else if (numOfRotations < 9) {
transform.Rotate (new Vector3 (0,40.0f,0));
} else if (numOfRotations == 9) {
transform.rotation = rotationAtStart;
}
}
void Update() {
if (numOfRotations < 9) {
rotate();
}
}
}
360°的特殊情况使此方法稳定。对于小于360°,你必须忍受小的舍入误差。对于这种情况,我会建议计算目标四元数Quaternion.RotateTowards
并将其设置为与360案例类似的最后一步。
另一个有用的东西是你Animations。您可以将动画定义为平滑或离散步骤,如果按“i”,则只需拨打GameObject.animation.Play("MyRotation")
即可。动画终止时,最后使用动画事件通知。
最后Mathf包含一个处理浮点不精确问题的函数Approximately。
来源
2011-12-12 11:18:17
Kay
如果我曾经喜欢你的建议将是改变对象的本地轴,或者将它只能旋转对象的动画? – Dave
您可以为游戏对象的变换的成员设置动画。 transform.rotation在欧拉角 – Kay
感谢您的帮助。尽管如此,它更像是一种侧重解决问题的方式。我不能说如果(transform.eulerAngles.y == 40.0f),因为即使旋转朝向给出更准确的结果仍然存在错误。我还没有尝试过这个动画建议,但是我现在就去试试看。 – Dave