【发布时间】:2016-08-10 10:28:50
【问题描述】:
我正在尝试根据 Reynolds 的经典 Boids 论文,更具体地说是 Dan Shiffman 在 natureofcode.com 上的实现,创建一个具有到达行为的自主代理。这两种方法都很容易理解(并且有效),但它们都假设一个固定的标称更新步骤,而不是查询自上次帧更新以来经过的时间并在欧拉积分步骤中应用这个时间增量。即他们简单地建议:
//pseudocode
acceleration.add(force);
velocity.add(acceleration);
location.add(velocity);
但是,如果我想包含时间增量,那么各种物理论文建议我应该将其重写为:
//pseudocode
delta = timeElpasedSinceLastFrameUpdate();
acceleration.add(force);
deltaAcceleration = acceleration.mult(delta);
velocity.add(deltaAcceleration );
deltaVelocity = velocity.mult(delta);
location.add(deltaVelocity);
这也有效,直到我尝试实现转向行为,特别是到达行为。有关该方法的参考,请参见此处链接中的示例 6.2:
Nature of Code Steering Behaviours
有问题的步骤(在伪代码中)是转向力 = 期望 - 速度;
在没有时间增量的情况下,“-速度”对转向力的贡献正确地抵消了当前保持的速度矢量,并使物体在到达目的地减速停止。
应用时间增量后,当我将加速度乘以增量时,steeringForce 被分数时间增量有效缓和,因此没有对累积速度施加足够的减速度以使物体及时停止并且我开始振荡行为。
我可以通过不将累积力(即加速度)乘以时间增量来“解决”这个问题,但这似乎不正确。
所以,我的问题:
应如何生成用于到达行为的转向力以考虑可变增量时间?
感谢任何帮助!
【问题讨论】:
标签: javascript physics