개발 사이트들에서 렌더링 테크닉에 대한 논의는 많은 데, 게임에서의 세세한 (어쩌면 사소한...) 처리에는 논의가 없는 거 같아서 나름대로 별거 아니지만 아이디어가 될만한 것을 하나 적어봅니다. (어쩜 논의가 없는 것이 저만 모르고 고민하는 거라서 그럴지도 모른다는 생각도 들지만, 아닐 꺼라 위안하면서... T_T )

이번에 얘기하고자 하는 것은 캐릭터 충돌, 이동에 관한 것인데, 계단 오르기나 앉아서 이동하기에 대한 아이디어가 되었으면 하고 적습니다. (화이트데이란 게임에 적용한 것을 기반으로 적습니다. 뭐 나름대로는 고민하면서 만들었던 부분입니다만... T_T )

우선은 기본적으로 캐릭터의 충돌 모델은 구 몇 개로 대체합니다.
구를 사용한 것은 속도도 빠르고, 충돌 처리도 용이하기 때문이죠.
(구의 sweep 처리는 어렵지 않기 때문에 처리상의 이점을 위해 배경의 충돌 디테일을 크게 낮추지 않아도 되었고, 동적인 오브젝트와 캐릭터간의 처리도 그냥 무난하게 할 수 있습니다.)

게임의 레벨에 따라 구를 실린더로 대체하거나 구의 개수를 조절하거나 해야 겠습니다만, 간단히 얘기하는 것은 화이트 데이에서 사용한 것을 기본으로 설명하겠습니다.
화이트 데이에서는 구 3개를 사용 했는데, 첨부된 그림을 보시면 쉽게 이해하실 수 있을 겁니다.



1번 구는 완전히 바닥에 붙도록 설정하고 2번 구는 캐릭터가 올라갈 수 있는 턱의 높이로 설정합니다. 3번 구는 머리 부분에 설정해서 앉거나 할 때 같이 상하 이동합니다.
(1번과 2번 구는 (캐릭터의 좌표계에서는) 이동이 없습니다.)

충돌처리
--------

충돌은 3개의 구에 대해서 모두 하고 가장 가까이 충돌한 면에 대해서 캐릭터가 충돌한 것으로 판단합니다.
(의자에 걸려서 못 이동한다거나, 일반적으로 이동 가능한 문이더라도 의자 위에서는 머리가 부딪혀서 문을 통과 못한다거나 하는 자연스러운 처리가 가능할 겁니다.)

레벨(배경)에 따라 구의 위치와 크기를 적당히 조절해야 하는 데, 위와 같이 3개를 설치할 경우 가슴 위치의 오브젝트에는 충돌을 안 하는 신기한 경우가 생길 수도 있겠습니다.
이 경우에는 가슴 부분에도 구를 추가로 설정하거나, 레벨 자체에 그런 경우가 없게 디자인하면 되겠습니다. (화이트데이는 구의 위치만 잘 조절하고, 후자의 방식을... ^^)

앉기처리
--------

서기와 앉기는 실제로 3번 구만 수직 이동하는 식입니다.
구의 위치가 낮아지기 때문에 위에서 예를 든 의자 위의 상황에서도 앉아서 통과하는 게 가능해 질 겁니다.

단 수직으로 상승할 때는 충돌체크를 해야 합니다.
만약 낮은 통로를 앉아서 통과할 때 서버리면 적당히 머리가 천정에 닿을 정도에서 더 이상 일어설수 없도록 되어야 할겁니다.

그리고 항상 머리의 위치를 체크 한다면 (2번에서 머리의 위치로 충돌체크해서 충돌되는 지점이 있다면 3번의 위치를 조절하는 식으로...) 서 있을 때도 머리에 오브젝트의 압박이 들어올 때 자연스럽게 고개를 숙이는 효과도 얻을 수 있을 겁니다. (예를 들어 낮은 천장에서 점프를 했을 때...)

앉아있느냐 서 있느냐에 대한 처리도 3번 구의 위치로 판단할 수 있습니다.
(달릴 때 활용할 수 있겠죠. 단순히 높이만으로 굽힌 상태에서는 못 뛴다거나 하는 처리도 가능하겠습니다.)

슬라이딩
--------

일반적으로 슬라이딩은 구 하나를 사용해서 하는 것과 완전히 동일합니다.
단지 충돌된 위치나 평면을 구할 때 3개로 체크 한다는 점만 다르기 때문에 기본적으로 구 하나로 처리할 수 있다면 문제될게 없습니다.

계단오르기
--------

계단을 오를 수 있나 없나 체크는 간단합니다.
그림처럼 충돌 체크 했을 때는 2번 충돌 구의 이동 벡터가 1번의 것보다 깁니다. (그림의 박스가 올라가기엔 좀 많이 높기도 하고, 이동 벡터도 한 프레임에 이동하기엔 엄청나게 크긴 합니다만...)
이 경우엔 적당히 계단 오르는 애니메이션을 하던가 좌표를 수직 상승하여 계단위로 올라가던가 하면 되겠습니다.

(적당히 턱을 올라가는 이동 아이디어)
만약 이동 벡터가 V 이고 올라갈 수 있는 턱의 높이가 h 라면 "(0, h, 0) 만큼 수직이동", "V 이동", "(0, -h, 0) 만큼 수직이동"의 3 스텝으로 나누어서 처리합니다. 아마 머리에 그려보시면 이해가 가실 겁니다.
이 경우 턱 위에 높이 공간이 별로 없을 경우 2번째 스텝에서 이동을 못하는 자연스러운 처리도 될 것입니다. (앉아서 턱을 지나야 하겠죠.)

기타아이디어
------------

충돌처리를 약간 응용하면 떨어지기 직전의 위치인지도 체크 할 수 있습니다.
현재의 위치는 바닥과 충돌 체크 했을 때 바닥 바로 위에 있다고 판단되는 데, 이동후의 위치(혹은 적당히 앞의 위치)에서는 떨어진다고 판단 되는 경우라면 현재 위치가 절벽이나 난간 같은 곳이라고 판단할 수 있습니다.
(이 경우 추가적으로 배경정보를 얻는 다거나 떨어질 깊이를 체크하던가 해서, 적절히 팔을 흔들면서 오버액션을 취하던가 매달리거나 하는 식의 자연스러운 처리를 삽입할 수 있겠습니다.)

개인적으로는 ICO나 마리오, 젤다의 전설 같은 잘된 3D 게임들 플레이 해보시길 추천합니다. 게임 플레이 하면서 여러 가지로 생각해볼 수 있어서 좋은 거 같습니다. (게임과 무관하게 점프해서 매달리고, 떨어지고, 밀고, 당기고, 줄타고... ^^)

게임 프로그래밍에 관련된 여러 가지를 교환하고 보완하고 했으면 하는 바람으로 사소한 거지만 올려봅니다. (게시판에 엄숙하고 조용한 분위기가 흘러서 문제입니다만...) 캐릭터의 이동에 관한 여러 가지 아이디어들도 많이 오고 갔으면 좋겠습니다. (바닥 안 미끄러지기 같이 처리나 사례라던가, 유저들이 환장하는 타격 감에 대한 것이라던가...)

댓글을 달아 주세요

  1. 유기철 2004/02/17 12:35  댓글주소  수정/삭제  댓글쓰기

    넘 감사합니다..ㅠㅠ

  2. 아노아 2003/02/01 21:54  댓글주소  수정/삭제  댓글쓰기

    ~ _~) 감사합니다.

  3. crc12 2002/12/30 16:30  댓글주소  수정/삭제  댓글쓰기

    개인적으로 타격감을 굉장히 중요시 하는데 타격감에는 [사운드]와 [효과 그래픽]이 가장 중요한것 같습니다. 그냥... 플스에 철권시디 넣어 놓고 사운드 없이 해보면 알게 되죠 ^^

  4. crc12 2002/12/30 16:25  댓글주소  수정/삭제  댓글쓰기

    게임코드에 글은 처음인데 실제 구현한 방식을 설명해 주셔서 믿음이 가네요 ^^

  5. hot girl making out 2007/10/18 06:34  댓글주소  수정/삭제  댓글쓰기

    너는 아름다운 웹사이트가 있는다!