代码之家  ›  专栏  ›  技术社区  ›  rafvasq

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

  •  0
  • rafvasq  · 技术社区  · 7 年前

    在给定四列数据的情况下,我模拟汽车在道路网络中行驶 time , id , x z 有身份证的车在哪里 身份证件 位于 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 回复  |  直到 7 年前
        1
  •  2
  •   Programmer    7 年前

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

    moveToX 函数通过使用 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));
        }
    }
    

    然后,您可以通过调用coroutine函数来启动移动:

    void Start()
    {
        StartCoroutine(MoveCar());
    }
    
    推荐文章