C# 统一性:在给定目标点和方向的情况下真实地转弯

C# 统一性:在给定目标点和方向的情况下真实地转弯,c#,unity3d,simulation,C#,Unity3d,Simulation,我有一个CSV,它在给定时间t以秒为单位,给我一辆id为id的汽车的x,z坐标下面的是id=1的汽车的摘录数据,以及几秒钟内的坐标。在前三秒,汽车停了下来。然后它左转,继续笔直行驶几秒钟 此时,我正在根据下一个位置计算方向,并旋转汽车使其朝向下一个位置,但转弯处没有“曲线”,它只是直接移动到下一个位置: Vector3 direction = (nextPosition - car.transform.position).normalized; if(direction != Vector3.z

我有一个CSV,它在给定时间
t
以秒为单位,给我一辆id为
id的汽车的
x,z
坐标下面的是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);
}
考虑到这些点,特别是转弯处的
958
959
这两个点,有没有更现实的方法来转弯?我知道Unity的标准asset
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

正如我在回答上一个问题时所指出的,一个好的第一近似方法是计算测量值之间“间隙”的平均速度,将汽车指向平均速度的方向,就完成了

这不会产生真实的运动,因为汽车的速度不会瞬间改变。更确切地说,是施加在汽车上的力,这些力使汽车在特定方向加速。(请注意,减速是一种加速;我没有区分加速和减速。)

你有每秒的位置,你知道如何计算前一个问题中每秒的平均速度。现在用同样的方法计算平均加速度。我们知道,
F=ma
,所以如果汽车的质量保持不变,那么作用在汽车上的净力与加速度成正比

你能做的是,在每一秒,问你自己一个问题,“为了在已知的位置和速度下到达下一个已知点,在这个精确的时刻,我需要什么加速度?”也就是说,如果我从时间t开始沿着加速度向量平稳加速,在t+1时,什么向量能使我到达已知的位置和平均速度

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

由于颠簸,它们仍然不会完全平滑;也就是说,加速度的瞬时变化,人类将其视为一种急促的运动。比如有人在车里把地板铺成地板,或者突然转弯

要使运动真正平滑,你需要更进一步,并对加速进行同样的操作。弄清楚为了在下一秒达到我的目标位置、速度和加速度,我每秒需要什么样的挺举

然后你可以在几秒钟之间插值位置、速度和加速度,得到一个很好的平滑运动

这不是从一系列点获得平滑运动的唯一方法,但这样做有助于塑造角色你能想出其他方法来解决这个问题吗

(我也注意到这个问题在任何维数上都不是很难。你可以先考虑一维运动的问题,然后把你的解扩展到二维运动)。 让我们看一些数字,我们只看x数字

我们知道,在前几秒钟,位置是-1.5,然后在下一秒钟,位置是-4.5。所以平均速度和加速度一度为零,然后平均速度一度为-3。因此加速度是0到-3,这是-3的差值,所以我们每秒加速了-3米,持续了一秒钟

现在让我们考虑一下

假设你停下来,持续施加一个力,使你每秒加速-3米。很明显,一秒钟后,你将以每秒3米的速度前进。但是你会在哪里呢?如果你瞬间从零上升到-3米/秒,那么一秒钟后你会离你-3米远,但我们不再把速度建模为瞬时速度!你离起始位置只有-1.5,而不是-3

你需要的实际平均加速度是-6。一秒钟的平均加速度是-6,从现在开始,你的速度是-6,但你是从零开始的,所以那一秒钟的平均速度,正如我们所希望的,是-3。这会让你在一秒钟内从-1.5变为-4.5,这就是你想要的

那么,在958.5时刻的位置和速度是多少,给定一个-6米/秒/秒的恒定加速度,从速度零点开始?速度是-3,正如我们所预期的——平均速度应该是一半左右。位置的变化是Δt(你知道为什么吗?),这是-6*0.5*0.5/2,也就是-0.75,这是我们在这一秒要用到的-3的四分之一。同样,这应该是有道理的:我们在上半秒的移动速度比下半秒慢,所以到上半秒我们应该还不到一半

现在做同样的事情,但是为了混蛋。如果你这样做,你会发现你的动作确实非常流畅


我希望这一切都有意义。一篇好的介绍性物理课文在这里可能会有很大的帮助。

正如我在回答上一个问题时所指出的,一个好的第一近似方法是计算测量值之间“间隙”的平均速度,将汽车指向平均速度的方向,这样就完成了

这不会产生真实的运动,因为汽车的速度不会瞬间改变。更确切地说,是施加在汽车上的力,这些力使汽车在特定方向加速。(请注意,减速是一种加速