game-physics - 如何在 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
应用的部分,我很难完全理解该代码并尝试以正确的方式实现二次阻尼。
解决方案
解决了!我没有得到力矢量的方向也是局部的,这是解决方案:
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)
}
推荐阅读
- python - 如何使用 python 的 selectolax 解析器在 html 中查找视频标签
- ios - 点击时更改和保持 UICollectionView 单元格大小
- python-3.x - TypeError: 'int' object is not subscriptable - 在进行特征工程时
- excel - 查找并替换 2 个符号之间长度可变的字符串
- docker - 如何在 devcontainer.json 中正确指定多个 docker-compose.yml 文件
- javascript - 在 React.js 中根据不同页面渲染不同的 headers
- node.js - 通过邮递员将 json 解析为猫鼬模式,但其格式无效
- python - 预测类别及其相应的概率
- java - 从 Netbeans 启动 Tomcat Webapp 的问题
- python - 连接并获取所有列标题