블로그 이미지
˙Jisoo

카테고리

분류 전체보기 (72)
Programming (33)
Game Project (14)
Daily Life (12)
Photo Shots (11)
Total11,497
Today57
Yesterday77


게임개발에서 반드시 필요한 기술 중 하나인 충돌처리입니다.
단순히 두 물체간의 충돌여부를 판정하는 것은 수식만 잘 세워놓으면 되기에 그리 어렵지 않다고 생각합니다. (AABB이던 OBB이던)
개인적으로는 벽면이나 오브젝트에 다가갔을때 자연스럽게 뒷처리를 하는것이 더 까다롭다고 생각되네요.. 캐릭터와 맵,오브젝트 등 서로 상호작용해야하는 변수들이 필요하니까요.
기본적으로는 속도와 방향벡터를 서로 공유해야합니다.
3D 게임에서 캐릭터가 벽에 닿았을때 캐릭터를 멈추게 할 것이 아니라 캐릭터에 작용하고있던 벡터값과 벽면의 노멀벡터값을 이용하여 미끄러짐벡터(Sliding Vector)를 되돌려줘서 진행시켜줘야 합니다.

충돌여부를 판단하고 노멀값을 얻기위해서는 여러가지 방법이 있겠지만 저는 삼각형폴리곤 기반으로 제작중입니다.
현재 CollisionMap 생성은 다음과 같이 진행됩니다.

1. 메쉬파일을 불러와 그대로 충돌맵으로 생성
   - 레벨디자인 시에 충돌처리를 위한 면들을 직접 추가해 주었을 경우나 실내같은 간단한 레벨에서 편리합니다.
2. 메쉬파일을 불러와 최적화를 시킨뒤 충돌맵으로 생성
   - 복잡한 지형을 가진 레벨에서 연산을 줄여주기 위해 폴리곤값들을 최소화 해 준 뒤에 충돌맵을 생성합니다.
      동굴같이 울퉁불퉁한 곳은 폴리곤 갯수를 줄여주어도 캐릭터가 움직일때는 어색해보이지 않습니다.
3. 메쉬파일에서 BoundingBox를 생성하여 충돌맵으로 생성
   - 캐릭터간의 충돌, 오브젝트와의 충돌 등에서 해당 메쉬의 모든 삼각형과 충돌연산을 하는것은 말그대로 낭비입니다.
      메쉬의 복잡도도 높고 삼각형의 크기도 작은편이기에 2번의 방법을 쓴다면 오히려 어색한 연산을 보입니다. 버그도 많이 발생할테구요.
      그래서 BoundingBox를 생성하여 충돌맵으로 생성해줍니다. 이럴경우 12개의 삼각형만 가지게 되므로 연산 수가 많이 줄어듭니다.

동영상에서 실내형태의 맵파일은 1번 방법을 이용하였고, 슬롯머신 오브젝트는 3번을 이용한 예 입니다.
모서리 부분마다 점이 찍혀있는데 디버깅모드에서 보이는 충돌맵의 모서리확인용입니다.
일단 이렇게 세가지 방법을 사용중이고 부족하다 싶으면 바운딩박스를 세분화시켜서 2번과 3번의 중간쯤 되는 기능을 추가해줘야겠지요.
그리고 가끔 맵에 낑기는 버그가 있는데 이것부터 수정해줘야겠네요..
저작자 표시 비영리 동일 조건 변경 허락

'Programming > DirectX' 카테고리의 다른 글

Shadow Map Test  (0) 2010/01/28
충돌처리 과부하 테스트  (0) 2010/01/26
기본적인 충돌처리 구현  (0) 2010/01/21
Shadow Map  (0) 2010/01/16
애니메이션 블렌딩  (0) 2010/01/14
Lightmap 돌아오다 !  (0) 2010/01/12
Posted by ˙Jisoo

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함