설모의 기록

[Cocos creator] ray cast 란? 본문

게임엔진/Cocos creator

[Cocos creator] ray cast 란?

HA_Kwon 2018. 1. 31. 14:57

ray cast 란?

  이번에도 클래시 로얄 게임으로 예를 들어보겠습니다 (제가 요즘 클래시 로얄에 빠져있어서..ㅎ). 위의 그림에서 보시면 빨간색의 상대방 캐릭터가 제 캐릭터인 드래곤과 충돌해 공격을 준비하는 장면입니다.만약 ray cast 를 사용하지 않고 그냥 attack () 함수를 이용해 드래곤의 hp 를 깎아주도록 구현을 했다면 어색한 장면이 보일겁니다. 빨간색 캐릭터는 불을 쏴서 드래곤을 공격하지만 그 불은 드래곤을 지나쳐 뒤따라오는 두 마리의 고블린에게도 타격을 입히는 모습이 나타나기 때문입니다. 이런 어색한 장면이 있다면 상대방에게는 너무 억울한 상황이겠죠? 불 공격 한방으로 세 마리의 캐릭터에게 타격을 입혀야하는데 겨우 드래곤 한 마리라니,, 


  그래서 적용하는 것이 ray cast 개념입니다. ray cast 는 선을 하나 그려놓고 그 선에 있는 충돌체들에게 타격을 입히는 것입니다. 이해가 되시나요? 위의 사진으로 예를 들자면 빨간색 캐릭터는 누군가가 공격 범위안에 들어온다면 선 하나를 생성해 그 선 위에 있는 드래곤과 고블린 한 마리에게 불 타격을 주는 것입니다 (다른 한 마리의 고블린은 같은 선상에 있지 않을 것 같은 느낌이어서 제외했습니다). 


  cocos creator 에서는 physicsManager 에서 rayCast 기능을 제공합니다. 이제 예를 들어볼까요?


우선 physicsManager 의 enabled 를 true 로 바꿔주세요.

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


기본적인 함수 사용법은 아래와 같습니다.

cc.director.getPhysicsManager().rayCast(시작점, 끝점, rayCastType);

  함수의 매개변수의 개수는 총 3개로 시작점, 끝점, 그리고 타입 세가지입니다. 시작점과 끝점은 말그대로 선의 시작점과 끝점을 말합니다. 이 때 주의하실 점은 점의 위치는 캔버스가 기준이 아니라 씬 자체가 기준입니다. 

  예를 들어 위의 캔버스를 보시면 캔버스의 앵커포인트가 (0.5, 0.5) 이고 포지션이 (570, 360) 입니다. 이 때, 시작점을 (0, 0) 을 했다고 해서 캔버스의 정중앙이 아니라 왼쪽 아래에 표시한 곳이 (0, 0) 입니다. 헷갈려 하시지 않길 바랍니다!


세 번째 인자인 rayCastType 은 4가지가 있으며 입력하지 않으시면 cc.RayCastType.Closest 가 디폴트로 설정됩니다. 또한 결과가 여러 개의 충돌체 배열로 반환된다해도 가까운 순서대로 정렬되어 있지는 않는다고 합니다. 하나하나 살펴볼까요?

  • cc.RayCastType.Any : 시작점과 끝점을 이은 선 위의 어떤 충돌체를 감지하게 되면 즉시 감지를 멈추고 더 이상 다른 물체를 감지하지 않습니다.. 
  • cc.RayCastType.Closest : 선 위의 충돌체 중 시작점과 가장 가까운 충돌체를 가져옵니다.
  • cc.RayCastType.All : 선 위의 모든 충돌체를 반환합니다. 다른 타입보다 비용이 많이 들고 느린 검사입니다.
  • cc.RayCastType.AllClosest : 선 위의 충돌체 중 서로 가장 가까운 충돌체들이 반환되며 가장 느린 검사입니다.


코드에서 사용하시는 방법은 아래와 같습니다.

var p1 = new cc.Vec2(100, 100);
var p2 = new cc.Vec2(1100, 100);
var results = cc.director.getPhysicsManager().rayCast(p1, p2, cc.RayCastType.Closest);

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;
}

results 를 포문으로 돌아보면 포문안의 정보들을 얻을 수 있습니다.


아래의 그림을 보시면 더 이해가 잘 되실 겁니다.

점 p1, p2 가 있고 그 선 위의 충돌체 collider 가 존재합니다. 변수 collider 는 충돌 컴포넌트이고 point 는 ray path 와 충돌체가 만나는 점입니다. normal 은 표면과 충돌점의 벡터입니다. 마지막으로 fraction 은 ray path 의 길이를 1로 보면 point 가 어디쯤 위치하는지를 나타냅니다. 위의 충돌지점은 선의 절반을 지나 0.6 정도에서 만나게 됩니다.


이상으로 ray cast 에 대해 알아보았습니다.


참고 사이트 : https://github.com/cocos-creator/creator-docs/blob/373c11b37e4b93f33c264dd85ea4233ac86159d2/en/physics/physics/physics-manager.md

Comments