화이트데이 이야기 #3 - 물리 시뮬레이션 화이트데이 제작기

99년 Game Developer Conference에 모인 많은 게임 프로그래머들은
다음 세대의 기술적 이슈를 묻는 질문에 인공지능과 물리학을 꼽았다.
몇 년후 현실로 나타난 게임들은 이들의 예상이 옳았음을 입증해주었다.

결국에는 아무것도 들어가지 않았지만
화이트데이도 개발초기에는 그럴듯한 물리학을 적용하고 싶었다.

물리학을 게임에 응용하는데는 여러가지 레벨이 있겠는데

A. 강체(rigid body)나 여러가지 종류의 역학 계산으로
오브젝트 단위의 상호작용을 게임 플레이에 반영
(하프라이프2나 GTA시리즈처럼 - 가장 고수준이며,
창발적인(emergent) 상황이 많이 발생해서 재미있다)

B. 본(bone) 단위의 링크된 움직임 계산
(라라 크로포드의 포니테일이나 시노비의 머플러)

C. 버텍스 단위의 계산 (옷자락의 표현이나 바스트 모핑 등)

D. A를 온라인으로 동기화 - 이쪽은 궁극의 영역


화이트데이 초기에는 A B C를 모두 조금씩 구현하고 싶었다.

A의 경우 교실에 있는 책상이나 의자를 이용해서
적과 재미있는 인터랙션을 만들고 싶었지만,
가장 어렵고 현실성 없는 부분이어서 포기했다.

이런걸 직접 만드려면 복잡한 전문지식과 수치적 테크닉을 필요로 하고,
성공한다해도 하복이나 카르마 피직스 같은 서드파티 물리엔진들보다
낫거나 차별화된 걸 만들 가능성은 거의 없다.

C의 경우 천(cloth) 시뮬레이션을 프로토타입에선 어느 정도 구현을
했었는데 몇가지 문제가 있고 손도 모자라고 해서 실제 코드로 옮기진
못했다. 버텍스들이 자기가 연결된 버텍스들과 스프링이나 체인으로
연결된 것을 흉내내는 것까지는 그렇게 복잡하지 않지만, 문제는 몸을
뚫고 들어가지 않도록 충돌검사하는 부분이다. 캐릭터의 머리카락이나
넥타이 같은 부분은 몸을 약간 뚫더라도 크게 어색하지 않게 보이는데,
스커트는 걷거나 달릴 때 다리가 뚫고 나오지 않게 하는 처리가 어렵다.

이때쯤 드림캐스트로 VF3가 나왔는데, 라우 아저씨와 같이 앞자락
스커트가 길고 움직임이 격렬한 캐릭터도 충돌검사가 깔끔하게
적용된걸 보고 감탄했다.

이와 비슷한 것을 만들어보고 싶어서 첫 시도는 윗다리를 캡슐
(구가 이동했을 때 휩쓸고가는 체적)로 정의하고, capsule-to-point의
충돌검사를 했다. 이것은 선분 대 정점의 거리계산과 같다.
이 방식은 버텍스 당 벡터 내적 계산 한 번씩만 해주면 되므로
속도는 빠르지만 헛점이 많았다. 천 부분의 폴리건도 많지 않았고,
속도를 위해 피직스가 적용되는 버텍스도 최소로 했으므로,
윗다리의 두께가 천 버텍스 사이의 거리와 큰 차이가 없어서
스커트 버텍스 사이로 숭숭 빠지는 문제가 생긴 것.

두번째 시도는 좀 더 복잡한 코드를 넣어서 capsule-to-line_segment
충돌검사를 했다. 이것은 선분 대 선분의 거리계산과 같다.
이 계산은 경우의 수도 많고 복잡하다. 게다가, 충돌검사를
위해서는 정지된 프레임의 충돌상태만 검출하는 것으로는 불충분하다.
PC게임은 콘솔게임과는 달리 유저의 시스템에 따라 프레임 레이트가
천차만별로 나타나므로, 검사 대상인 오브젝트가 이 전의 프레임에서
현재의 프레임까지 sweep한 체적을 가지고 검사하는쪽이 좋다.
하지만 선분 대 선분의 검사를 시간에 따른 변위까지 고려하면
2_triangle-to-2_triangle의 매우 복잡한 계산이 되므로 당시의
게임으로서는 무리였다. 삼각형끼리의 충돌검사는 경우의 수가 많고
복잡하다.

이런 충돌검사나 거리계산에 대해 관심 있다면 David Eberly씨의 책
잘 정리되어 있으므로 참고하기 바란다.
이런, 절판됐네.. ;;

어쨌든 이 단계까지 만들었던 프로토타입을 적용한게 하이텔
게임제작동호회에 공개했던 d3dgirl2(하단 참고) 라는 짧은 데모였다.
하지만, 프레임레이트가 조금만 불안정해져도 스커트가 충돌검사에
실패해서 밑으로 떨어진 이후로 돌아오지 않는다든가,
캐릭터가 초기화되거나 급속히 다른 동작으로 트랜지션을 할 때
선분이 캡슐을 한 프레임만에 지나쳐버린다든가 하는 문제 때문에
실용화할 수준은 못되었다.

그리고 그 얼마후 나는 프로그래머로서의 작업은 손을 떼고
기획과 디렉터로서 일을 시작했으며, NOERROR군이 실제 엔진작업을
할 때는 구현해야할 중요한 피처가 워낙 많아서 물리쪽은 손댈 여유가 없었다.

그래서 화이트데이에는 물리학이 전혀 없었으며,
아쉽게도 한소영양은 딱딱하게 굳어있는 포니테일을
뒤통수에 붙이고 걸어다니게 되었던 것이다.


--------------------------------------------------
doocub's D3D girl2 데모 다운받기



99년 3월에 만든 프로토타입.
혹시나 해서 하이텔을 찾아보니 VT모드로 자료실에 아직 남아있었다.
당시에 모델링 되게 못했군.. ;;
몇년만에 보니 부끄러워서 텍스처만 조금 고쳤음.


ctrl-n을 누르면 나타나는 숫자는, 물리학이 적용되는 버텍스에서
자기 주변의 링크 갯수를 의미한다. 붉은색 숫자로 표시되는 버텍스는
충돌했다는 뜻이다. ctrl-p로 pause 해가면서 보면 알 수 있다.
어차피 소프트웨어로 트랜스폼하던 시절이라 내 맘대로 마구 만들 수 있었다.

덧글

  • 류가희 2005/07/24 02:46 #

    윈도우 화면의 좌상에 위치한 큐빅에 그려진건...;

    ...자화상입니까.(덜덜)
  • WCB_Fina 2005/07/24 19:26 #

    에에 충돌검사가 잘 된 격투 게임들을 보면 놀랍기만 합니다 [...]
  • kwanny 2005/07/26 01:51 # 삭제

    흠...그런데 장나라 사진 좀 있으면 보내주세욤 (*.*)/
  • 항해자D 2005/07/29 00:44 #

    박정아씨랑 김희선씨는 있지만 장나라씨는 없어요 ㅎㅎ
  • 버금 2013/02/22 03:02 #

    치마와 다리의 충돌 검사.. 이외에도 서로 다른 성질의 것이 충돌 여부 체크

    아직 어렵네요
※ 로그인 사용자만 덧글을 남길 수 있습니다.


링크