使用Quaternion.Lerp平滑旋转

时间:2018-05-15 13:10:46

标签: unity3d quaternions

我正试图通过向下拍摄光线投影并将我的角色旋转与正常情况对齐来将角色与地面对齐。

这是一个片段:

RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
}

当我试图平滑旋转时,它似乎根本就没有发生。

这就是我试图摧毁这些价值观的方式。

RaycastHit hit;
Vector3 ray = transform.TransformDirection(Vector3.down);

if(Physics.Raycast(transform.position, ray, out hit)) {
    quatTargetRotation = Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.rotation;
    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.FromToRotation(Vector3.up, hit.normal), 0.5f * Time.deltaTime);
}

quatTargetRotation是Quaternion类的类变量。

1 个答案:

答案 0 :(得分:1)

尝试:

transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(hit.normal), 0.5f);

您似乎使用, 0.5f * Time.deltaTime);作为t参数。这不会起作用,因为:t需要在您想要达到目标轮换的时间内从0变为1。

0.5f * Time.deltaTime会摇晃一些小值,每帧都不同。

创建一个在Update()调用后幸存的计时器变量。例如public float timer = 0f;。然后像timer += Time.deltaTime一样增加值。

替代方案:使用像0.5f这样的常量值 - 这会在每次调用时旋转50%的差异。而且这种差异当然会缩小。因此旋转速度将减慢(可能需要平滑旋转),但绝不会100%达到目标。