Frontend/Cocos Creator

[Cocos Creator 물리] 3. Physics Manager

에반황 2018. 2. 1. 16:23


이 글은 PC 버전 TISTORY에 최적화 되어있습니다.


서론

 Cocos Creator는 물리 처리에 대해 두 가지를 지원합니다. 하나는 저번 포스트에서 다뤘던 Collision Manager 그리고 오늘 다룰 Physics Manager입니다. Physics Manager는 다룰 내용이 많기 때문에 여러번에 걸쳐 포스트 하도록 하겠습니다. 

 왜 Collision Manager와 Physics Manager를 따로 지원할까요? 둘다 다뤄보면서 제가 생각한 것은 충돌 처리 기능만 필요한 프로젝트는 가벼운 Collision Manager를 충돌을 포함한 가속도, 중력, 물리 관절 등을 사용해야하는 프로젝트는 Physics Manager를 사용하는 것이 더 적절했습니다. 


3. Physics Manager
3-1. RigidBody
3-2. Physics Collider Component
3-3. Contact (충돌처리)
3-4. Joint


Physics Manager

 Cocos Creator Physics Manager는 Box2D를 물리엔진으로 사용하고 있습니다. 사용자에게는 Box2D에 대한 세부 구현을 숨기고 Box2D 기능의 대부분을 Physics Manager를 통해 쉽게 접근할 수 있게 해줍니다.




Physics Manager 세팅


Physics Manager 사용

Physics Manager (이후론 물리 관리자로 편하게 부르도록 하겠습니다.) 는 기본적으로 비활성화되어 있습니다. 물리 시스템 관련 함수를 사용할 때 먼저 해야 할 일은 물리 관리자를 활성화하는 것입니다. 활성화 후부터 물리 객체가 물리 시스템의 영향을 받게 됩니다. 활성화는 다음의 문법으로 합니다.

cc.director.getPhysicsManager().enabled = true;

  

물리 관리자를 비활성화/활성화 했을 때 물리 객체가 중력의 영향을 받는지 테스트




Physics 디버깅 사용

물리 시스템은 기본적으로 디버깅 정보를 그려 내지 않습니다. debugDrawFlags를 설정하면 디버깅 정보를 그릴 수 있습니다. 물리 시스템은 다양한 디버깅 정보를 제공하며 정보를 결합하여 관련 내용을 그릴 수 있습니다.

cc.director.getPhysicsManager().debugDrawFlags = cc.PhysicsManager.DrawBits.e_aabbBit |
    cc.PhysicsManager.DrawBits.e_pairBit |
    cc.PhysicsManager.DrawBits.e_centerOfMassBit |
    cc.PhysicsManager.DrawBits.e_jointBit |
    cc.PhysicsManager.DrawBits.e_shapeBit;

드로잉 플래그를 0 설정하여 디버깅을 비활성화합니다.

cc.director.getPhysicsManager().debugDrawFlags = 0;

aabb 충돌 범위(rect)과 shapeBit(circle collider)이 디버깅되고 있음



중력 설정하기

중력은 물리에서 가장 많이 쓰이는 부분입니다. 대부분의 물리 사용 게임은 중력을 중요한 특징으로 사용합니다. 중력이 약 1초당 -10 가속도로 떨어진다고 생각했을 때 픽셀로는 -320 픽셀이 떨어진다고 생각할 수 있습니다. (1m = 320pixel) 그렇기 때문에 기본 중력을 나타내려면 y값을 -320픽셀로 지정해주면 되겠죠.

중력을 0으로하려면 다음과 같이 설정하면됩니다.

cc.director.getPhysicsManager().gravity = cc.v2 ();

320픽셀/s^2로 지정하게되면 현실적인 중력을 구현할 수 있습니다.

cc.director.getPhysicsManager().gravity = cc.v2 (0, -320);



유용한 메서드

 게임 내에서 물리 객체를 탐지하고 싶을 때가 있을 것입니다. 예를 들어, 폭탄이 폭발하면 범위 내의 물체가 충돌되어 튕겨나가거나 또는 전략 게임에서 사용자가 드래그하여 유닛들을 선택할 수 있어야하겠죠. 물리 관리자는 우리의 이런 요구를 충족시킬 수 있는 몇가지 메서드를 지원합니다.


Point 테스트

Point 테스트는 월드 좌표계 아래에 특정 좌표가 포함 된 충돌 객체가 있는지 테스트합니다. 테스트가 성공적이면 Collider 정보를 반환합니다. 점이 포함 된 여러 충돌 객체가 있으면 임의의 충돌 객체가 반환됩니다.

var collider = cc.director.getPhysicsManager().testPoint(point);

collider가 있는 부분을 클릭 했을 때 collider가 있는 것을 체크할 수 있음


Rect 테스트

직사각형 테스트는 콜리더의 경계 상자와 교차하는 (직각 좌표계에서) 지정된 직사각형이 있는지 테스트합니다. 성공하면 콜 리더가 반환 목록에 추가됩니다.

var colliderList = cc.director.getPhysicsManager().testAABB(rect);


Raycast 테스트

일명 Raycast는 설정된 라인이 통과하는 Collider를 검출하는 데 사용됩니다. 주어진 선이 지나가는 지점에서 법선 벡터와 다른 유용한 정보를 얻을 수 있습니다. (주의 - 캔버스의 anchor가 (0.5, 0.5)라면 rayCast의 (0, 0)은 캔버스의 중간이 아닌 좌측 하단부터 (0, 0)으로 인지합니다.)

var results = cc.director.getPhysicsManager().rayCast (p1, p2, type);

for (var i = 0; i <results.length; i ++) {
    var result = results [i];
    var collider = result.collider;
    var point = result.point;
    var normal = result.normal;
    var fraction = result.fraction;
}

Raycast 함수 의 마지막 매개 변수는 탐지 유형을 지정하고 네 가지 유형을 지원합니다. 이는 Box2d의 광선 탐지가 광선 시작점의 가장 가까운 객체에서 감지되지 않기 때문에 결과가 광선의 시작 근처에서 객체와의 거리별로 정렬되는 것을 보장 할 수 없습니다. Cocos Creator의 물리 시스템은 Box2d 테스트 결과가 탐지 유형에 따라 정렬되는지 여부를 결정합니다. 이 유형은 결과 리턴에 영향을 미칩니다.


    cc.RayCastType.Any :광선 경로상의 모든 충돌자를 감지합니다. 충돌 장치를 감지하면 즉시 감지 프로세스가 끝나고 더 이상 다른 개체를 감지하지 않습니다. 보장할 수 없기 때문에 항상 가장 가까운 충돌체를 감지하지 않습니다.

    cc.RayCastType.Closest : 광선 경로에서 가장 가까운 충돌자를 rayCast탐지합니다. 위의 방법보다 약간 느립니다.

    cc.RayCastType.All : 광선 경로의 모든 Collider들을 탐지합니다. 탐지 결과는 순서가 보장되지 않습니다. 여러 충돌체를 반환할 수 있습니다. 광선이 b2Fixture 탐지를 실행하고 충돌체가 여러 b2Fixture로 구성 될 수 있기 때문입니다. 이것은 비용이 많이 드는 방법이며 위의 방법들보다 느립니다. Physics Collider Component 포스트에서 확인하세요.

    cc.RayCastType.AllClosest : 광선 경로에있는 모든 Collider가 감지되지만 결과는 각 Collider의 가장 가까운 점에대한 관련 정보만 필터링되어 반환됩니다. 가장 느린 유형입니다.


 

 

 cc.RayCastType.Closest

 cc.RayCastType.Any


 


 

 cc.RayCastType.All

 cc.RayCastType.AllClosest



Raycast의 결과

광선 검출의 결과에는 많은 유용한 정보가 포함되어 있으므로 필요에 따라 정보들을 활용할 수 있습니다.

    collider: 광선이 통과한 collider 객체

    point: 광선이 교차한 점

    normal: 교차점의 표면에서의 법선 벡터(교차점의 Collider 직선기준으로 수직선분)

    fraction: 광선의 시작점과 끝 사이에서 얼마나 곱해야 교차점에 도달할 수 있는지 수치를 나타냅니다. 아래 그림에서는 p1, p2 사이의 60%정도의 거리에 교차점이 위치하여 0.6이라는 수치를 보여줍니다.


다음 그림을 통해 광선 감지 결과를 더 잘 이해할 수 있습니다.


레이 캐스팅 - 출력









반응형