2015-07-11 31 views
0

我正在js中做一棵樹。我畫在畫布上。 我使用p2.js物理引擎進行分支的逼真移動。我正在通過RevoluteConstraint加入分支機構。 我有一個問題。我的樹枝之間堵塞。p2.js通過其他移動的身體

所有的工作。但我希望這些手臂的身體是絕對的,可以穿過其他手臂。

我試圖將世界解算器的容差設置爲高或低,但它不起作用。

代碼:

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

請張貼您的代碼。 – byako

回答

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