我正在尝试制作类似绳索的约束,其中该约束就像反弹的弹簧一样。
我正在尝试使用约束组件:
<a-box id="other-box" dynamic-body />
<a-box constraint="target: #other-box;" dynamic-body />
但是它似乎可以在固定距离上工作。我该如何发弹?
答案 0 :(得分:0)
Cannon.js有自己的Spring。它的构造函数具有三个基本选项,如下所示:
new CANNON.Spring(bodyA, bodyB, { // bodies attached to the spring
restLength: 2, // spring length when no force applied
stiffness: 50, // how much can it stretch
damping: 1, // how much will it suppress the force
});
在计算物理的每个步骤中,还必须将弹簧力施加到附着的物体上:
world.addEventListener("postStep", function(event) {
spring.applyForce();
});
还有更多选项,请务必在docs中检查一下并进行一些试验!
如何将其与a框架一起使用?使用a帧physics system时,可以使用cannon.js。
您可以创建一个框架部件,这将创建弹簧。确保physics
正文已加载:
AFRAME.registerComponent("spring", {
schema: {
target: {
type: 'selector'
}
},
init: function() {
let data = this.data
let el = this.el
if (this.el.body) {
// check whether we can access the physics body
this.createSpring()
} else {
// or wait until it's loaded
this.el.addEventListener("body-loaded", () => {
this.createSpring()
})
}
},
createSpring: function() {
let data = this.data
let cannonWorld = this.el.sceneEl.systems.physics.driver.world
var spring = new CANNON.Spring(this.el.body, data.target.body, {
restLength: data.restLength,
stiffness: 100,
damping: 1,
});
// Compute the force after each step
canonWorld.addEventListener("postStep", function(event) {
spring.applyForce();
});
}
})
HTML
<a-box position="0 2.6 -2" id="other-box" color="blue" static-body></a-box>
<a-box position="0 2 -2" color="green" dynamic-body spring="target: #other-box"></a-box>
在此fiddle中进行检查。