首页 > 解决方案 > 如何在 cannon.js 中对身体施加二次阻力?

问题描述

我想对cannon.js 的身体施加阻力,我已经尝试过某种方式,但它破坏了物理学,想知道是否有更正确的方法,或者是否有人已经做过类似的事情。

物体有一个属性叫做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?

这是linearDamping应用的部分,我很难完全理解该代码并尝试以正确的方式实现二次阻尼。

标签: game-physicscannon.js

解决方案


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

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)
}

推荐阅读