我试图用设定的最大速度模拟2维的物体,并且当它处于最大速度但是它没有朝正确的方向移动时,我很难构建物体行为的数学模型< em>和进一步加速被最大速度限制部分阻挡。
E.g。它的最高速度是√2,它目前在(1,1)并且它应该真正朝向(√2,0)。如果它只是沿着x轴直接加速,它将打破它正在运行的速度限制。
相反,它需要随着时间的推移将其速度“滑动”到正确的方向。我一直在做的是计算新的速度,如果它变得太高,则按最大速度进行缩放:
newVelocity = oldVelocity + acceleration * dt;
if(newVelocity.getLength() > maxSpeed){
newVelocity = newVelocity.scale(maxSpeed);
}
哪个有用(有点),但是我需要重构它以使其更平滑 - 因为,不依赖于模拟的粒度 - 此刻,如果我做了一次传递,我会得到不同的结果(比方说)两次传球,其值为dt的一半。
我一直试图将其建模为速度为圆上的一个点,然后计算应用为圆的正切的加速度量
但是(这是我的力学和微积分使我失败的地方)是如何将从当前速度角和加速度中得到的瞬时角速度的计算转换为基于时间的公式,我可以用它来计算在单个模拟标记上改变实际速度。
我几乎可以肯定这个问题有一个相当直接的解决方案 - 我只是无法找出谷歌的术语集。
答案 0 :(得分:0)
如果您当前处于v =(1,1)且想要加速到v =(√2,0),则有两种选择。
按照从v =(1,1)到v =(√2,0)的直线,通过应用与(√2-1,1)成比例的恒定加速度一段时间。在此期间,物体的行进速度将低于其最大速度,但它将尽快达到所需的速度。
按照最大速度曲线,在每个瞬间,应用最大加速度,方向垂直于当前速度。在这种情况下,你试图向右转,所以当你的速度为(1,1)时,你的加速度将与(1,-1)成比例,就在你的速度为(√2,0)之前,你的速度将是几乎与(0,-√2)成比例。听起来这是你想要做的,但请记住,它不一定是最佳的。
现在进行一些快速计算。您的速度圆具有半径maxSpeed
,意味着它具有圆周2*π*maxSpeed
,并且两个最大速度点之间沿该圆的距离等于θ*maxSpeed
,其中θ是那些之间的角度速度。如果您可以按maxAcceleration
加速,并且您的步长为dt
秒,则会在maxAcceleration*dt
的圆圈或maxAcceleration*dt/maxSpeed
的角度给您一个距离。因此,如果您当前的速度角度为θ,则在步骤结束时角度应为θ +/- maxAcceleration*dt/maxSpeed
。