【发布时间】:2023-03-06 09:43:01
【问题描述】:
我一直在试验出色的 PhysicsJS 库,尤其是约束和碰撞。我想要实现的是一个可以围绕固定旋转点旋转的多边形。作为一个真实世界的例子,想象一个用一根长钉子钉在墙上的宽架子的中心,这样当偏离中心的东西从上面掉到上面时,它就会旋转大约半圈或一圈。
这是一个小提琴示例:http://jsfiddle.net/2HRGW/41/
和代码:
Physics(function (world) {
var renderer = Physics.renderer('canvas', {
el: 'viewport',
width: 500,
height: 400
});
world.add(renderer);
var nail = Physics.body('circle', {
x: 250,
y: 200,
radius: 5,
mass: 1,
fixed: true
});
world.add(nail);
var shelf = Physics.body('convex-polygon', {
x: 250,
y: 200,
vertices: [{
x: -100,
y: -10
}, {
x: 100,
y: -10
}, {
x: 100,
y: 10
}, {
x: -100,
y: 10
}],
mass: 100,
restitution: 0.5
});
world.add(shelf);
var ball = Physics.body('circle', {
x: 175,
y: 50,
radius: 20,
mass: 10
});
world.add(ball);
world.add(Physics.integrator('verlet', {
drag: 0.003
}));
var verletConstraints = Physics.behavior('verlet-constraints', {
iterations: 2
});
verletConstraints.distanceConstraint(shelf, nail, 1);
world.add(verletConstraints);
world.add(Physics.behavior('constant-acceleration'));
world.add(Physics.behavior('body-collision-detection'));
world.add(Physics.behavior('body-impulse-response'));
world.add(Physics.behavior('sweep-prune'));
world.add(Physics.behavior('verlet-constraints'));
var bounds = Physics.aabb(0, 0, 500, 400);
world.add(Physics.behavior('edge-collision-detection', {
aabb: bounds,
restitution: 0.01
}));
Physics.util.ticker.subscribe(function (time, dt) {
world.step(time);
});
world.render();
Physics.util.ticker.start();
world.subscribe('step', function () {
world.render();
});
});
我为钉子定义了一个固定的圆,为架子定义了一个非固定的多边形,并添加了一个将多边形连接到圆的距离约束。如您所见,有两个问题。首先,搁板立即略微下降,直到其顶部边缘与指甲顶部齐平,而不是保持均匀定位在指甲周围。其次,当球掉到架子上时,尽管尝试了质量和各种恢复设置,但架子会疯狂地不停地旋转。稍微调整一下位置,有时甚至可以完全脱离飞走。
我以这种方式使用约束是在正确的轨道上,还是有更简单的解决方案?
【问题讨论】:
-
架子正在疯狂旋转,因为它与钉子发生碰撞,PhysicsJS 正在尝试解决碰撞问题。
-
好的 - 但这是正确的整体方法吗?如果有,需要调整什么?如果没有,你能举个例子吗?
-
这是一个有条件地禁用身体碰撞响应的补丁:gist.github.com/anonymous/86c0ba8b4f1f85b11f0e。它还解决了“稍微偏离中心”的问题。
-
总的来说,方法很好。你刚刚遇到了 PhysicsJS 的不足——毕竟它是一个相对较新的库。如果您不想自己修补 PhysicsJS 的麻烦,这里有一个应用了我上一条评论中的补丁:gist.github.com/anonymous/5716ef7004dc4fa20173
-
谢谢你,再加上 sokie 关于质量的观点,这太完美了——现在我可以让架子在球滚下时缓慢旋转(使用低球质量设置),或者旋转疯狂地转圈(球质量很高)。我将把这个问题留到另一天左右,以防万一还有其他替代方法需要考虑。谢谢大家!
标签: javascript constraints physicsjs