首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PhysicsJS --如何创建一个物体在撞击时围绕一个定点旋转?

PhysicsJS --如何创建一个物体在撞击时围绕一个定点旋转?
EN

Stack Overflow用户
提问于 2013-11-19 08:19:58
回答 2查看 2.1K关注 0票数 2

我一直在试验优秀的PhysicsJS库,特别是约束和冲突。我想要实现的是一个多边形,它可以围绕一个固定的旋转点旋转。作为一个现实世界的例子,想象一个宽的架子钉在墙上,只有一个长钉子穿过它的中心,当一个偏离中心的东西从上面掉下来时,它旋转了大约半圈或一圈。

下面是一个小提琴示例:http://jsfiddle.net/2HRGW/41/

守则如下:

代码语言:javascript
复制
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();
});
});

我为钉子定义了一个固定的圆,为架子定义了一个非固定的多边形,并添加了一个将多边形连接到圆的距离约束。正如你所看到的,有两个问题。首先,架子立即稍微下降,直到它的顶部边缘与钉子顶部齐平,而不是保持在指甲周围均匀的位置。其次,当球掉到架子上时,架子就会疯狂地不停地旋转,尽管已经尝试了大量的和各种各样的复原设置。稍微调整一下它的位置,有时它甚至可以完全分离并飞走。

我是以这种方式使用约束的正确途径,还是有更简单的解决方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-19 17:35:03

正如其他用户所提到的,这是当前PhysicsJS的一个限制。它正在制定中:

同时,为什么不创建自定义引脚约束行为,而不是修补库。对于一个简单的引脚约束行为,它将身体质心固定到目标位置,这是相当容易的。下面是一个示例的jsFiddle,它在开头定义了一个自定义引脚约束管理器。

http://jsfiddle.net/wellcaffeinated/2HRGW/50/

代码语言:javascript
复制
// create a behavior to handle pin constraints
Physics.behavior('pin-constraints', function( parent ){
    return {
        init: function( opts ){
            parent.init.call( this, opts );
            this.pins = [];
        },

        add: function( body, targetPos ){
            this.pins.push({
                body: body,
                target: Physics.vector( targetPos )
            });
        },

        behave: function( data ){

            var pins = this.pins
                ,pin
                ;

            for (var i = 0, l = pins.length; i < l; i++){
                pin = pins[ i ];
                // move body to correct position
                pin.body.state.pos.clone( pin.target );
            }
        }
    };
});
票数 7
EN

Stack Overflow用户

发布于 2013-11-19 08:49:14

您的总体实现是正确的。唯一出错的是凸多边形的质量,100是一个野生值。对于这个物体来说,质量在0.2左右就足够了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20066434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档