개발 · 컴퓨터공학 / / 2022. 10. 18. 12:30

three.js cannon.js Contact Material

728x90
반응형

 물리엔진에서의 Material은 그 물체의 재질을 결정한다. cannon.js의 Contact Material은 특정 Material끼리 부딪혔을 때의 물리연산을 결정한다.

// Contact Material
const defaultMaterial = new CANNON.Material('default');
const rubberMaterial = new CANNON.Material('rubber');
const ironMaterial = new CANNON.Material('iron');
const defaultContactMaterial = new CANNON.ContactMaterial(
    defaultMaterial,
    defaultMaterial,
    {
        friction: 0.5,
        restitution: 0.5
    }
);
cannonWorld.defaultContactMaterial = defaultContactMaterial;

const rubberDefaultContactMaterial = new CANNON.ContactMaterial(
    rubberMaterial,
    defaultMaterial,
    {
        friction: 0.5,
        restitution: 0.7,
    }
);
cannonWorld.addContactMaterial(rubberDefaultContactMaterial);

const ironDefaultContactMaterial = new CANNON.ContactMaterial(
    ironMaterial,
    defaultMaterial,
    {
        friction: 0.5,
        restitution: 0,
    }
);
cannonWorld.addContactMaterial(ironDefaultContactMaterial);

위 코드를 보면 cannon.js의 material객체로 여러 종류의 material을 설정하였다.

Contact Material을 생성할 때 어떤 두 Material이 부딪혔을 때, 마찰과 반발이 얼마나 적용될 지를 설정할 수 있다. 

생성한 Contact Material을 world의 default로 설정 혹은 추가하여 재질에 따른 물리연산을 설정할 수 있다.

 

unity engine에서 physics material을 설정하는 것과 비슷한 기능으로 보인다.

 

const floorShape = new CANNON.Plane();
const floorBody = new CANNON.Body({
    mass: 0,
    position: new CANNON.Vec3(0,0,0),
    shape: floorShape,
    material: defaultMaterial,
});
floorBody.quaternion.setFromAxisAngle(
    new CANNON.Vec3(-1, 0, 0),
    Math.PI / 2
);
cannonWorld.addBody(floorBody);

const sphereShape = new CANNON.Sphere(0.5);
const sphereBody = new CANNON.Body({
    mass: 1,
    position: new CANNON.Vec3(0, 10, 0),
    shape: sphereShape,
    material: ironMaterial,
});
cannonWorld.addBody(sphereBody);

Body를 생성할 때 material을 지정해주어야 적용된다. (material은 default로 설정되지 않는다)

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유