【问题标题】:How to calculate acceleration needed based on existing acceleration/velocity rules如何根据现有的加速度/速度规则计算所需的加速度
【发布时间】:2013-03-21 19:59:55
【问题描述】:

我有 3 个值来确定对象的运动:velocityaccelerationmaxVelocity。我还有一个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 中添加什么值以确保循环不会永远运行?假设距离/速度/最大值可以是您无法更改的任何数字。

【问题讨论】:

    标签: c++ math physics acceleration


    【解决方案1】:

    你的问题很容易受到限制。我认为最好的解决方案是减速(即向与速度相反的方向加速),这样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); 
    

    这很好用。那里有一个小问题让我有点困扰,但我现在不想追查——它可能会抵消代码中的一个问题。

    【讨论】:

      猜你喜欢
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多