我目前正在制作飞行模拟器。现在,我正试图让飞机自行飞行,但我试图旋转飞机使其平行于地面时遇到一些问题。
这是我的代码:
heightDetect = new Ray (transform.position, Vector3.down);
if (Physics.Raycast (heightDetect, out hit, Mathf.Infinity)) {
Debug.Log (hit.distance);
transform.rotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
Debug.DrawRay (heightDetect.origin, heightDetect.direction*1000);
}
代码可以正常工作,但问题是它太过颠簸了。飞机上的摄像头在我的屏幕上不停地抖动,完全无法播放。有没有办法使这个过程顺利进行?谢谢!
答案 0 :(得分:1)
据推测,您在Update
功能中执行此操作,因此每秒多次更改飞机的旋转次数。您可以使用spherical linear interpolation:
public float speed = 0.1f;
void Update() {
...
var targetRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * speed);
}
这有效地平滑了旋转。它的工作原理是获取当前旋转和最终所需的旋转,但仅在其间的某处返回旋转(由speed
控制)。
答案 1 :(得分:0)
如果我理解正确,您正在寻找Quaternion.Lerp来平滑四元数的旋转,或Mathf.LerpAngle进行Vector3旋转。
用法示例:
Vector3 currentRotation = transform.rotation;
Vector3 newRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
newRotation = new Vector3(
Mathf.LerpAngle(currentRotation.x, newRotation.x, Time.deltaTime),
Mathf.LerpAngle(currentRotation.y, newRotation.y, Time.deltaTime),
Mathf.LerpAngle(currentRotation.z, newRotation.z, Time.deltaTime));
transform.rotation = newRotation;
将Time.deltaTime
乘以任何值以更改lerp的“速度”。