如何在cannon.js中向物体施加二次拖动力?

时间:2018-09-26 15:45:36

标签: game-physics cannon.js

我想对cannon.js' body施加拖曳力,我尝试了一种方法,但它破坏了物理原理,想知道是否有更正确的方法或有人已经做过类似的事情。

该物体的一个属性为linearDamping,它是与速度成线性比例的拖曳力,但是我试图实现流体拖曳力公式,以实现更高的真实感。

简化公式就是这个公式,正如您所见,它与速度呈二次方关系:

Fd = - Constant * getMagnitude(velocity)**2 * normalize(velocity)

我已经使用Vec3方法在cannon.js中实现了。请注意,每次更新我都会调用applyDrag

applyDrag(coefficient) {
  const speed = body.velocity.length()

  const dragMagnitude = coefficient * Math.pow(speed, 2)

  const drag = body.velocity.clone()
  drag.scale(-1, drag)

  drag.normalize()

  drag.scale(dragMagnitude, drag)

  body.applyLocalForce(drag, new CANNON.Vec3())
}

但是,这种排序中断了,对象发疯了。 是否有更好的方法来应用某种quadraticDamping

This is the part where linearDamping is applied,我很难完全理解该代码,并且难以以正确的方式实现二次阻尼。

1 个答案:

答案 0 :(得分:0)

解决了!我没有得到力矢量的方向也是局部的,这是解决方法:

applyDrag(coefficient) {
  const speed = body.velocity.length()

  const dragMagnitude = coefficient * Math.pow(speed, 2)

  const drag = body.velocity.clone()
  drag.scale(-1, drag)

  drag.normalize()

  drag.scale(dragMagnitude, drag)

  const centerInWorldCoords = body.pointToWorldFrame(new CANNON.Vec3())
  body.applyForce(force, centerInWorldCoords)
}