2017-01-02 1 views
2

"Matter.js body documentation"에 설명 된대로 충돌 필터링을 사용하려고합니다. 그러나, 내 프로젝트에 대한 다른 합성 개체 간의 충돌을 해제해야합니다. 따라서 동일한 합성물에있는 물체 만 충돌해야합니다. 필자는 32 개 이상의 Composites (32 개는 Matter.js가 제공하는 충돌 범주의 최대량 임)를 가질 계획입니다. 나는 이것을 어떻게 얻을 수 있을까?Matter.js가 서로 다른 합성물 간의 충돌을 차단합니다

// module aliases 
var Engine = Matter.Engine, 
    Render = Matter.Render, 
    World = Matter.World, 
    Bodies = Matter.Bodies, 
    Body = Matter.Body, 
    Vector = Matter.Vector, 
    Composite = Matter.Composite, 
    Constraint = Matter.Constraint, 
    MouseConstraint = Matter.MouseConstraint; 

// create an engine 
var engine = Engine.create(); 

// create a renderer 
var container = document.getElementById("container"); 
var canvas = document.getElementById("maincanvas"); 

var render = Render.create({ 
    element: container, 
    canvas: canvas, 
    engine: engine, 
    options: { 
     height: 400, 
     width: 400, 
     wireframes: false 
    } 
}); 

// This makes collision much easier to test 
engine.world.gravity = {x:0, y:0}; 

// Add a mouseconstraint to test 
var mc = MouseConstraint.create(engine, { 
    element: render.canvas 
}); 
Composite.add(engine.world, mc); 

var bodies1 = [] 
var bodies2 = [] 
var xpos = 30 
var ypos = 30 
for (var i = 0; i < 5; i++){ 
    bodies1.push(Bodies.circle(xpos, ypos, 10, { 
     collisionFilter: { 
      group:-1 
     }, 
     render: { 
      fillStyle: "blue" 
     } 
    }) 
    ); 
    xpos += 30; 
} 
for (var i = 0; i < 5; i++){ 
    bodies2.push(Bodies.circle(xpos, ypos, 10, { 
     collisionFilter: { 
      group:-1 
     }, 
     render: { 
      fillStyle: "red" 
     } 
    }) 
    ); 
    xpos += 30; 
} 

var composite1 = Composite.create(); 
Composite.add(composite1, bodies1); 
var composite2 = Composite.create(); 
Composite.add(composite2, bodies2); 

Composite.add(engine.world, [composite1, composite2]); 

Engine.run(engine); 
Render.run(render); 

이렇게하면 합성물 간의 충돌을 비활성화 할 수 있지만이 또한 합성물의 '내부'충돌을 비활성화합니다. collisionFilter.category 시스템을 사용하여이 작업을 수행 할 수 있지만 32 개 이상의 복합체에서 어떻게 작동합니까?

답변

1

합성 수준에서 충돌 필터링을 지원하지 않으므로 본문 수준에서 처리해야합니다. 이를보다 쉽게 ​​관리하려면 몇 가지 복합 도우미 함수를 만듭니다. compositeSetCollisionFilter(composite, filter)Composite.allBodies(composite)을 반복합니다.

32 개 범주의 제한은 bitwise implementation (실제 성능면에서는별로 중요하지 않지만 현실적으로는 그렇다) 때문입니다. 프로젝트에서 reconsidering this에 관한 문제를 제기했습니다.

Matter.Detector.canCollide(filterA, filterB)을 두 개의 body.collisionFilter 개체를 비교할 수있는 자신의 함수로 바꾸면 더 많은 방법이 있습니다. 이것으로 당신은 body.collisionFilter 개체에 대해 당신이 좋아하는 구성을 사용할 수 있습니다.

관련 문제