Lerp不能始终保持平稳的汽车运动

时间:2018-06-05 16:59:07

标签: c# unity3d lerp

我正在模拟通过道路网络行驶的汽车,给出了四列数据timeidxz,其中标识为id的汽车位于x,0,z的时间t以下是一个示例:

t   id  x   z
957,1,-1.50,250.07
958,1,-1.50,232.39
959,1,-4.50,209.72
960,1,-4.50,193.05
961,1,-4.50,176.39
962,1,-4.50,159.72
963,1,-4.50,143.05
...

此刻,我能够随着时间的推移和根据数据产生汽车并更新他们的位置。我坚持如何更真实地模拟汽车的运动,而不是汽车只是从一点到另一点弹出。

我正在使用Vector.Lerp,但它没有一致,平滑的动作跳跃:

car.transform.position = 
    Vector3.Lerp(car.transform.position, nextPosition, Time.deltaTime);

每一秒,我检查上面的数据,找到当前秒的汽车坐标。这些坐标作为nextPosition传递到上面的Lerp函数中。这意味着汽车每秒都在点到点“拉”。

如何让动作更流畅?位置更新是每秒钟,因此汽车需要在1秒内到达下一个位置。

1 个答案:

答案 0 :(得分:2)

您需要使用moveToX函数将对象移动到x秒内的位置。它简化了整个过程。您现在要做的就是循环遍历列表中的每个位置,以及moveToX函数并提供对象必须存在的时间(1秒)。

moveToX函数的工作原理是使用Time.deltaTime递增计数器变量,直到达到指定的目标时间。 t是通过将该计数器除以导致01值的目标时间来计算的,因为t Vector3.Lerp期望的是public GameObject car; public List<Vector3> pos; bool isMoving = false; IEnumerator MoveCar() { //Loop over each postion for (int i = 0; i < pos.Count; i++) { //Get next position Vector3 nextPosition = pos[i]; //Move to new position within 1 second yield return StartCoroutine(moveToX(car.transform, nextPosition, 1.0f)); } } 。所有这些必须在协程函数中完成,因为协同程序简化了函数中的等待。

void Start()
{
    StartCoroutine(MoveCar());
}

然后你可以通过调用协同程序函数来启动运动:

{{1}}