团结:在给定目标点和方向的情况下逼真地转动汽车

raf*_*asq 0 c# simulation unity-game-engine

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

鉴于刚刚这些点,特别是两个在958959在转弯时,有没有办法更真实地使转弯?我知道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
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 5

正如我在回答你之前的问题时所提到的,一个好的第一个近似是计算测量之间"间隙"的平均速度,将汽车指向平均速度的方向,然后就完成了.

这不会产生逼真的运动,因为汽车当然不会瞬间改变速度.相反,有力施加在汽车上,力量使汽车沿特定方向加速.(请注意,减速是一种加速 ;我没有区分加速和减速.)

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

那么你可以做的就是每一秒,问自己一个问题"在这个确切的时刻我需要加速度才能到达已知位置和速度的下一个已知点?" 那就是:如果我从时间t开始沿着加速度矢量平滑加速,那么什么向量会使我达到我的已知位置和时间t + 1的平均速度?

一旦你知道了那么你可以在秒之间插入速度矢量,你会发现曲线更平滑.然后以相同的方式插入位置.

因为混蛋,它们仍然不会很完美; 也就是说,加速度的瞬时变化,人类认为它是一种抽搐动作.就像有人把它放在车里,或突然转弯一样.

为了使动作非常平滑,您需要更进一步,并采取相同的技巧来加速.弄清楚我每秒钟需要什么混蛋才能在下一秒达到我的目标位置,速度和加速度.

然后,您可以在秒之间插入位置,速度和加速度,并获得良好的平滑运动.

这不是从一系列点获得平滑运动的唯一方法,但它是这样做的角色. 你能想到解决这个问题的其他技术吗?

(另外,我注意到在任何数量的维度上问题都不是那么难.你可以考虑首先解决一维运动的问题,然后将解决方案扩展到二维运动.)

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

我们知道,在前几秒,位置是-1.5,然后在下一秒,位置是-4.5.所以平均速度和加速度暂时为零,然后平均速度为-3秒.因此,加速度为零到-3,这是-3的差值,所以我们每秒加速-3米/秒.

现在让我们考虑一下.

假设你已经停止了,并且你不断施加一个能使你加速每秒-3米的力.一秒钟之后,你将以-3米/秒的速度运转.但你会在哪里?如果你瞬间从零到-3米/秒然后你会在-3秒之后离开一秒钟,但我们不再将速度建模为瞬间!距离起始位置只有-1.5,而不是-3.

你需要的实际平均加速度是-6.-6的第二平均加速度得到你的速度,从现在-6一秒,但是你开始在零,所以平均在那第二速度,我们想,-3.这让你在一秒内从-1.5到-4.5,这就是你想要的.

那么:在速度为零的情况下,给定-6 m/s/s的恒定加速度时,958.5时的位置和速度是多少?速度是-3,正如我们所预期的那样 - 平均值应该在中途.并且位置变化是a ?t2/ 2(你知道为什么吗?)那么这是-6*0.5*0.5/2,这是-0.75,是我们将在这一秒中进行的-3的四分之一.再说一次,这应该是有道理的:我们在上半场比第二场下半场,所以我们应该在上半场比赛的一半时间内不到一半.

现在做同样的事情,但对于混蛋.如果你这样做,你会发现你的动作确实很顺利.

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

  • +1很好的答案.当有人说*做数学时,人们有时会不明白!*在答案中,如果你真的没有深入到模型中,你就不能说你钉了一个问题.如果gamedev对你很重要,你应该接受一些代数和微积分. (2认同)