团结:逼真的给定目标点和方向的汽车

时间:2018-06-26 22:05:34

标签: c# unity3d simulation

我有一个CSV文件,可以在给定时间x,z内以秒为单位给出id的汽车的t坐标。 以下是具有id=1的汽车的摘录数据,其坐标为几秒钟。在最初的三秒钟内,汽车停了下来。然后,它向左转 并继续直行几秒钟。

此刻,我正在根据下一个位置计算方向,并旋转汽车使其朝向该方向,但是转弯处没有“曲线”,它只是直接移动到下一个位置:

Vector3 direction = (nextPosition - car.transform.position).normalized;
if(direction != Vector3.zero)
{
    Quaternion lookRotation = Quaternion.LookRotation(direction);
    float step = speed * Time.deltaTime;
    car.transform.rotation = Quaternion.Slerp(car.transform.rotation, lookRotation, Time.deltaTime * rotationSpeed);
}

仅给出这些要点,特别是发生转弯的958959处的两个点,是否有办法更现实地转弯?我知道Unity的标准资产CarController.cs具有 steering 功能,但是我不确定是否可以利用它来发挥自己的优势。

t,id,x,z
956,1,-1.50,232.39
957,1,-1.50,232.39
958,1,-1.50,232.39
959,1,-4.50,209.72
960,1,-4.50,193.05
961,1,-4.50,176.39

1 个答案:

答案 0 :(得分:5)

正如我在对上一个问题的回答中指出的那样,一个很好的第一近似方法是计算两次测量之间的平均速度,将汽车指向平均速度的方向,然后就完成了。

这不会产生逼真的运动,因为汽车当然不会立即改变速度。而是在汽车上施加了,并且在特定方向上使汽车加速。 (请注意,减速是一种加速度;我没有在加速度和减速度之间进行区分。)

您每秒都有一个位置,并且您知道如何根据上一个问题每秒计算平均速度。现在以相同的方式计算平均加速度。我们知道F = m a,所以如果汽车的质量保持不变,那么作用在汽车上的净力就与加速度成比例。

然后您每秒钟要做的是,问自己一个问题:“为了在已知位置和速度到达下一个已知点,我需要在这个确切时刻具有什么加速度?”也就是说:如果我从时间t开始沿着加速度矢量平稳地加速,那将是什么矢量使我到达时间t + 1处的已知位置和平均速度?

一旦您知道了,您就可以在秒之间对速度矢量进行插值,您会发现曲线更加平滑。然后以相同的方式对位置进行插值。

由于混蛋,它们仍然不能完全平滑;即加速度的瞬时变化,人类认为这是猛烈的运动。就像有人将它放在汽车上或突然转弯时一样。

要使运动真正平滑,您需要进一步走一步,并对加速做同样的技巧。找出我每秒需要做些什么,才能在下一秒满足我的目标位置,速度和加速度

然后您可以在几秒钟之间插值位置,速度和加速度,并获得平滑的运动。

这不是从一系列点上获得平滑运动的唯一方法,但这是建立角色的能力。 您能想到其他解决该问题的方法吗?

(此外,我注意到该问题在任何数量的维度上都没有变得更加困难。您可以考虑先解决一维运动的问题,然后再将其扩展到二维运动。)

让我们看一些数字,我们只看x图。

我们知道在最初的几秒钟内,位置为-1.5,然后在下一秒内,位置为-4.5。因此,平均速度和加速度一会儿为零,然后一秒钟的平均速度为-3。因此,加速度为零至-3,相差为-3,因此我们每秒以每秒-3米的速度加速度。

现在让我们考虑一下。

假设您已停止,并且不断施加力,每秒将使您加速-3米。显然,在一秒钟之后,您将达到每秒-3米。但是你会在哪里?如果您瞬时从零变到-3 m / s,那么一秒钟后您将处于-3米的距离,但是我们不再将速度建模为瞬时的!您距离起始位置仅-1.5,而不是-3。

您需要的实际平均加速度是-6。平均每秒-6的加速度会使您的速度从现在开始变为-6秒钟,但是您从零开始,因此在那一秒钟的平均速度为,如我们所愿,-3。这样一秒钟您就可以从-1.5到-4.5,这就是您想要的。

那么:从速度零开始,在恒定加速度为-6 m / s / s的情况下,时间958.5处的位置和速度是多少?正如我们所期望的那样,速度为-3-平均速度应约为一半。位置变化为a Δt 2 / 2(您知道为什么吗?)因此是-6 * 0.5 * 0.5 / 2,即-0.75,即-3我们将在第二秒进行。同样,这应该是有道理的:我们在上半秒比下半秒移动,所以在上半秒之前,我们应该小于一半

现在做同样的事情,只是为了混蛋。如果这样做,您会发现自己的动作确实变得非常流畅。

我希望一切都说得通。好的入门物理学课本可能对您有很大帮助。