如何根据现有的加速度/速度规则计算所需的加速度

How to calculate acceleration needed based on existing acceleration/velocity rules

本文关键字:加速度 速度 规则 计算所 何根      更新时间:2023-10-16

我有3个值决定对象的移动:velocity, accelerationmaxVelocity。我也有一个distance值,决定他们离目标有多近(基本上是一个X)。这段代码运行每帧来确定基于3个值的实际移动:

var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
velocity += velocityDelta;
var delta = velocity*0.016;
velocity += velocityDelta;
distance -= delta;

如果velocityDelta有点令人困惑的话它基本上是这样的:

velocityDelta = velocity + (acceleration * 0.016);
if (velocityDelta > maxVelocity) velocityDelta = maxVelocity;
else if (velocityDelta < -maxVelocity) velocityDelta = -maxVelocity;
velocityDelta = (velocityDelta - velocity) / 2;

现在,假设你只能改变acceleration的值,是否有一种方法来计算你需要什么加速度,以确保distance最终将恰好为0?意思是在上面代码运行的其中一个帧中,distance - delta == 0。假设代码是这样的:

var distance = 300.5;
var velocity = 125.86;
var maxVelocity = 300;
while (distance != 0) {
    acceleration = ?
    var velocityDelta = (Math.max(Math.min(velocity + (acceleration * 0.016), maxVelocity), -maxVelocity) - velocity) / 2;
    velocity += velocityDelta;
    var delta = velocity*0.016;
    velocity += velocityDelta;
    distance -= delta;
}

你会把什么值放入acceleration以确保循环不会永远运行?假设距离/速度/max可以是任何你不能改变的数字

你的问题是相当不足的。我认为最好的解决方案是减速(即在与速度相反的方向加速),这样maxVelocity就不会成为问题。

首先,找出在物体到达目标之前有多少时间间隔(假设没有加速):

var dt = 0.016;
var jumps = distance/(dt * velocity);   <-- round DOWN

然后应用一些基本的物理原理来让distance在这段时间内旅行:

x = vt + at^2/2
a = 2(x-vt)/t^2
acceleration = 2*(distance - velocity*jumps*dt)/(jumps*dt*jumps*dt); 

这工作得很好。这里有一个轻微的拼凑,这让我有点困扰,但我现在不想跟踪它——它可能会抵消代码中的拼凑。