对于汽车运动,Lerp 并不始终如一地平滑

Lerp not consistently smooth for car movement

我在给定四列数据 timeidxz 的情况下模拟汽车行驶在道路网络中,其中 ID 为 [=13 的汽车=] 位于 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 函数中。这意味着汽车 'Lerping' 每秒从一个点到另一个点。

怎样才能让动作更流畅?位置更新是每秒更新的,因此汽车需要在 1 秒内到达下一个位置。

您需要使用 function which moves object to a position within x seconds. It simplifies this whole stuff. All you have to do now is loop over each position in the list, and the 函数并提供对象必须存在的时间(1 秒)。

函数的工作原理是使用 Time.deltaTime 递增计数器变量,直到达到指定的目标时间。 t 是通过将该计数器除以目标时间得到 01 值来计算的,因为这是 Vector3.Lerp 中的 t 所期望的。所有这些都必须在协程函数中完成,因为协程简化了函数中的等待。

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