我有一个球体游戏对象,其中5个立方体放置在球体表面的不同点上。当按下一个键时,我希望球体旋转几秒钟,然后在立方体上的第一个立方体点上慢慢停止,并始终保持相同的旋转方向。我现在面临的问题是,Quaternion.Slerp始终采用最短路径到下一个立方体,这意味着有时旋转方向会发生变化。有什么想法吗?
由于
答案 0 :(得分:0)
您可以轻松地将轮换处理为Vector3 of Euler angles。
这样你可以Linearly Interpolate角度到正确的值。并且您可以使用coterminal角度,以便始终插入更高的值(因此不会发生向后旋转)。在每个旋转步骤之后,您可能希望使用此方法将角度标准化为0,360范围。
示例代码:
using UnityEngine;
using System.Collections;
public class Rotation : MonoBehaviour {
public Transform firstPosition;
public Transform secondPosition;
public float rotationDuration = 3;
void Start () {
transform.rotation = firstPosition.rotation;
StartCoroutine(Rotate());
}
IEnumerator Rotate() {
var deltaTime = 0.0f;
var distance = firstPosition.rotation.eulerAngles - secondPosition.rotation.eulerAngles;
while(deltaTime < rotationDuration) {
var rotation = transform.rotation.eulerAngles;
rotation = firstPosition.rotation.eulerAngles + deltaTime/rotationDuration*distance;
transform.rotation = Quaternion.Euler(rotation);
deltaTime += Time.deltaTime;
yield return null;
}
transform.rotation = secondPosition.rotation;
}
}