Unity - 使用RayCast将对象定向到地形(C#)

时间:2015-05-26 07:52:47

标签: c# unity3d

我目前正在制作飞行模拟器。现在,我正试图让飞机自行飞行,但我试图旋转飞机使其平行于地面时遇到一些问题。

这是我的代码:

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);

        }

代码可以正常工作,但问题是它太过颠簸了。飞机上的摄像头在我的屏幕上不停地抖动,完全无法播放。有没有办法使这个过程顺利进行?谢谢!

2 个答案:

答案 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的“速度”。