我想对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,我很难完全理解该代码,并且难以以正确的方式实现二次阻尼。
答案 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)
}