2

私は優れた PhysicsJS ライブラリ、特に制約と衝突を実験してきました。私が達成しようとしているのは、固定された回転点を中心に回転できるポリゴンです。現実世界の例として、壁に釘付けされた幅の広い棚を想像してみてください。中央に長い釘が 1 本だけ通されているため、中心から外れたものが上から落ちたときに、半回転または 1 回転します。

フィドルの例を次に示します: 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();
});
});

釘の固定円と棚の非固定ポリゴンを定義し、ポリゴンを円にリンクする距離制約を追加します。ご覧のとおり、2 つの問題があります。まず、シェルフは、爪の周りに均等に配置されたままではなく、上端が爪の上部と同じ高さになるまで、すぐにわずかに下がります。次に、ボールがシェルフに落ちると、質量とさまざまな復元設定を試したにもかかわらず、シェルフが無限に回転して狂ってしまいます。少し位置を調整すると、完全に分離して飛び立つこともあります。

このように制約を使用して正しい軌道に乗っていますか、それとももっと簡単な解決策がありますか?

4

2 に答える 2