C# Lerp对于汽车运动来说并不总是平稳的

C# Lerp对于汽车运动来说并不总是平稳的,c#,unity3d,lerp,C#,Unity3d,Lerp,我模拟汽车在道路网络中行驶,给定四列数据time,id,x和z,其中idid的汽车在t时间位于x,0,z,以下是一个示例: 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 ... 目前,我能够根据数据生成汽车并随着时间的推移更新它们的位置。我一直在研究

我模拟汽车在道路网络中行驶,给定四列数据
time
id
x
z
,其中id
id
的汽车在
t
时间位于
x,0,z
,以下是一个示例:

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秒内到达下一个位置。

您需要使用在x秒内将对象移动到某个位置的功能。它简化了整个过程。您现在所要做的就是循环列表中的每个位置,并使用函数和提供对象必须在那里的时间(1秒)

此函数使用
Time.deltaTime
递增计数器变量,直到达到指定的目标时间。
t
的计算方法是将该计数器除以目标时间,得到
0
1
值,因为这是
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));
    }
}
您需要使用在x秒内将对象移动到某个位置的功能。它简化了整个过程。您现在所要做的就是循环列表中的每个位置,并使用函数和提供对象必须在那里的时间(1秒)

此函数使用
Time.deltaTime
递增计数器变量,直到达到指定的目标时间。
t
的计算方法是将该计数器除以目标时间,得到
0
1
值,因为这是
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));
    }
}

Lerp
过去用于从“我现在所在的位置”到固定位置不是线性的。想象一下,时间是0.5,而不是
Time.deltaTime
,“移动一半到你的目的地。再移动一半。再移动一半。再移动一半。再移动一半。”看看这个关于悖论的参考,量化空间解决了它。@Rodrigos感谢你的链接,我看了一下,在
Lerp
函数中使用了
t
,类似于参考链接,但结果仍然不稳定。如何获得
nextPosition
?只需要知道如何获得将汽车移动到的下一个位置。@Programmer
nextPosition
是当前时间的坐标。参考我上面的样本数据,在
t=958
nextPosition=(-1.50,0232.39)
用于从“我现在所在的位置”到固定位置的Lerp不是线性的。想象一下,时间是0.5,而不是
Time.deltaTime
,“移动一半到你的目的地。再移动一半。再移动一半。再移动一半。再移动一半。”看看这个关于悖论的参考,量化空间解决了它。@Rodrigos感谢你的链接,我看了一下,在
Lerp
函数中使用了
t
,类似于参考链接,但结果仍然不稳定。如何获得
nextPosition
?只需要知道如何获得将汽车移动到的下一个位置。@Programmer
nextPosition
是当前时间的坐标。参考我上面的样本数据,在
t=958
nextPosition=(-1.50,0232.39)