对于汽车运动,Lerp 并不始终如一地平滑
Lerp not consistently smooth for car movement
我在给定四列数据 time
、id
、x
和 z
的情况下模拟汽车行驶在道路网络中,其中 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
是通过将该计数器除以目标时间得到 0
和 1
值来计算的,因为这是 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());
}
我在给定四列数据 time
、id
、x
和 z
的情况下模拟汽车行驶在道路网络中,其中 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 秒内到达下一个位置。
您需要使用
此 Time.deltaTime
递增计数器变量,直到达到指定的目标时间。 t
是通过将该计数器除以目标时间得到 0
和 1
值来计算的,因为这是 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());
}