p2.js身体穿过其他身体

时间:2015-07-11 16:28:04

标签: javascript canvas

我在js里做了一棵树。我在画布上画画。 我正在使用p2.js物理引擎进行分支。逼真的移动。我正在通过RevoluteConstraint加入分支机构。 我有一个问题。我的分支在他们之间堵塞。

一切顺利。但是我想要那些战壕'身体是绝对的,可以穿过其他的壕沟。

我试图将世界解算器的容忍度设置为高或低,但它不起作用。

代码:

world = new p2.World({
    gravity: [0, 10]
});

//new branch (fromX, fromY - from prev branch)
var body = new p2.Body({
    mass: 0,
    angle: this._generateAngle(-45, 45)
});
body.position[0] = fromX-(Math.sin(body.angle))*shape.height/2;
body.position[1] = fromY-(-Math.cos(body.angle))*shape.height/2;
body.addShape(new p2.Rectange(0.3, Math.random()*2));

//joining prev branch and this branch
var rc = new p2.RevoluteConstraint(prev_branch, body, {
    localPivotA: [0, -prev_branch.shapes[0].height/2],
    localPivotB: [0, body.shapes[0].height/2]
});
rc.setLimits(-Math.PI/8, Math.PI/8);
world.addConstraint(rc);
world.addBody(body);

完整代码:http://dkaraush.shpp.me/tree.js

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是禁用场景中的所有碰撞。这是通过关闭所有实体的碰撞响应来完成的:

// Turns off collisions with this body
body.collisionResponse = false;

如果要禁用分支之间的冲突,但仍然启用与场景中其他内容的冲突,则需要使用冲突组和掩码。

为此,我们创建两个碰撞组,一个用于风景形状,另一个用于分支形状。在场景中创建形状时,我们告诉他们他们属于哪个组(.collisionGroup)以及他们可以碰撞的组(.collisionMask)。

示例:

// Create collision groups
var SCENERY_GROUP = 1;
var BRANCH_GROUP = 2;

// Branch shape
branchShape.collisionGroup = BRANCH_GROUP; // Set group for this branch.
branchShape.collisionMask = SCENERY_GROUP; // It can only collide with scenery.

// Ground shape
groundShape.collisionGroup = SCENERY_GROUP; // Set group for the ground.
groundShape.collisionMask = BRANCH_GROUP; // It can only collide with branches.

如果您想要查看此p2.js功能,请查看Ragdoll demo