统一:在给定目标点和方向的情况下真实地转动汽车
Unity: turning a car realistically given target point and direction
我有一个 CSV 文件,可以在给定时间 t
以秒为单位提供 id
汽车的 x,z
坐标。 下面 是id=1
汽车的摘录数据,它是几秒钟内的坐标。前三秒,汽车停了下来。然后左转,然后继续直行几秒钟。
目前我正在根据下一个位置计算方向并旋转汽车朝向那个方向,但是转弯没有 'curve',它只是直接移动到下一个位置:
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);
}
鉴于这些点,特别是发生转弯的 958
和 959
处的两个点,是否有更实际的转弯方式?我知道 Unity 的标准资产 CarController.cs
具有 转向 功能,但我不确定我是否可以利用它来发挥我的优势。
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
正如我在回答您之前的问题时指出的那样,一个好的初步近似是计算两次测量之间的平均速度 "in the gap",将汽车指向平均速度的方向,然后您完成。
这不会产生逼真的运动,因为汽车当然不会瞬间改变速度。相反,有 力 应用于汽车,并且力 使汽车在特定方向上加速 。 (注意减速是一种加速;我没有区分加速和减速。)
你知道每一秒的位置,你知道如何计算上一题的每一秒的平均速度。现在以同样的方式计算平均加速度。我们知道F = m a
,所以如果汽车的质量不变,那么作用在汽车上的合力与加速度成正比。
然后你可以做的是每一秒问自己一个问题"what acceleration would I need to have at this exact moment in order to get to the next known point at the known position and velocity?"那就是:如果我从时间 t 开始沿着加速度矢量平稳加速,那会是什么矢量让我到达我的目标在时间 t+1 的已知位置和平均速度?
知道之后就可以插值速度向量在秒之间,你会发现曲线很多顺畅。然后以相同的方式对 positions 进行插值。
由于混蛋,它们仍然不会完全平滑;也就是说,加速度的瞬时变化,人类将其视为急动。比如有人在车里踩地板,或者突然转弯。
要使动作真正流畅,您需要更进一步,对加速度执行相同的技巧。弄清楚 为了在下一秒达到我的目标位置、速度和加速度。
我需要每秒多少加加速度
然后您可以在秒之间插入位置、速度和加速度,并获得漂亮的平滑运动。
这不是从一系列点获得平滑运动的唯一方法,但这样做可以塑造角色。 你能想出任何其他方法来解决这个问题吗?
(另外,我注意到这个问题在任何维度上都没有明显的困难。您可以考虑先解决一维运动的问题,然后将您的解决方案扩展到二维运动。)
让我们看一些数字,我们只看 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,a我们将在这一秒内进行的 -3 的四分之一。同样,这应该是有道理的:我们在上半秒比下半秒移动慢,所以我们应该不到一半 上半秒.
现在做同样的事情,但为了混蛋。如果你这样做,你会发现你的动作确实变得非常流畅。
我希望这一切都有意义。一本好的介绍性物理课本可能会对这里有很大帮助。
我有一个 CSV 文件,可以在给定时间 t
以秒为单位提供 id
汽车的 x,z
坐标。 下面 是id=1
汽车的摘录数据,它是几秒钟内的坐标。前三秒,汽车停了下来。然后左转,然后继续直行几秒钟。
目前我正在根据下一个位置计算方向并旋转汽车朝向那个方向,但是转弯没有 'curve',它只是直接移动到下一个位置:
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);
}
鉴于这些点,特别是发生转弯的 958
和 959
处的两个点,是否有更实际的转弯方式?我知道 Unity 的标准资产 CarController.cs
具有 转向 功能,但我不确定我是否可以利用它来发挥我的优势。
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
正如我在回答您之前的问题时指出的那样,一个好的初步近似是计算两次测量之间的平均速度 "in the gap",将汽车指向平均速度的方向,然后您完成。
这不会产生逼真的运动,因为汽车当然不会瞬间改变速度。相反,有 力 应用于汽车,并且力 使汽车在特定方向上加速 。 (注意减速是一种加速;我没有区分加速和减速。)
你知道每一秒的位置,你知道如何计算上一题的每一秒的平均速度。现在以同样的方式计算平均加速度。我们知道F = m a
,所以如果汽车的质量不变,那么作用在汽车上的合力与加速度成正比。
然后你可以做的是每一秒问自己一个问题"what acceleration would I need to have at this exact moment in order to get to the next known point at the known position and velocity?"那就是:如果我从时间 t 开始沿着加速度矢量平稳加速,那会是什么矢量让我到达我的目标在时间 t+1 的已知位置和平均速度?
知道之后就可以插值速度向量在秒之间,你会发现曲线很多顺畅。然后以相同的方式对 positions 进行插值。
由于混蛋,它们仍然不会完全平滑;也就是说,加速度的瞬时变化,人类将其视为急动。比如有人在车里踩地板,或者突然转弯。
要使动作真正流畅,您需要更进一步,对加速度执行相同的技巧。弄清楚 为了在下一秒达到我的目标位置、速度和加速度。
我需要每秒多少加加速度然后您可以在秒之间插入位置、速度和加速度,并获得漂亮的平滑运动。
这不是从一系列点获得平滑运动的唯一方法,但这样做可以塑造角色。 你能想出任何其他方法来解决这个问题吗?
(另外,我注意到这个问题在任何维度上都没有明显的困难。您可以考虑先解决一维运动的问题,然后将您的解决方案扩展到二维运动。)
让我们看一些数字,我们只看 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,a我们将在这一秒内进行的 -3 的四分之一。同样,这应该是有道理的:我们在上半秒比下半秒移动慢,所以我们应该不到一半 上半秒.
现在做同样的事情,但为了混蛋。如果你这样做,你会发现你的动作确实变得非常流畅。
我希望这一切都有意义。一本好的介绍性物理课本可能会对这里有很大帮助。