>아직은 시기상조겠지만 궁금해서 질문드립니다.
>FPS나 3D Action게임을 만들때는 공간을 필히 분할해야 한다고 들었습니다.

3D action 게임을 만들때뿐만이 아니라, 넓은 공간을 표현해야 하는 모든 게임들은 공간을 분할할 수 있어야 합니다. 왜? 넓은 공간을 구성하는데는 수십 수백만개의 폴리곤과 텍스춰 데이타들이 들어가는데, 그 데이타들을 한번에 그래픽 API 의 파이프라인으로 보내면 그래픽 카드는 자빠질 수 밖에 없습니다.



>만약 Quake3와 같은 게임에서 Indoor맵을 만드는데 포털엔진과 BSP를 사용한다면
>맵의 생성때부터 포털과 BSP가 적용된 맵을 만들어야 하는지요,
>그렇지 않다면 그래픽디자이너가 자유롭게 디자인한 모델을
>프로그램상에서 분할하여 렌더링하는지요.

BSP 라는 것에 대해서 선입견을 가지고 어렵게 생각할 필요는 없습니다. 제일 비슷하게 비유할 수 있는 것이 데이타 베이스 시스템의 테이블과 인덱스의 관계입니다. 폴리곤들을 쭉 모아놓은게 테이블이라면, BSP 데이타는 인덱스처럼 테이블안에 있는 데이타를 찾기 위한 보조정보입니다.

데이타에 인덱스를 매길때에는 여러가지 방법들이 있습니다. 어떤 필드를 키로 잡을 것인가, 인덱스를 탐색하기 좋은 구조로 만들려면 인덱스 파일 탐색의 알고리즘과 데이타 구조를 어떻게 할 것인가? 등등입니다.

결론을 말씀드리자면, 포털이나 BSP 등은 모델이나 맵에 있는 폴리곤 덩어리들에 붙는 부가 정보에 불과할 뿐이므로, 적절한 툴과 규칙이 있으면 원 폴리곤 정보들(예를 들면 .3ds 파일이나 .ase 파일)로부터 얼마든지 그러한 부가정보를 만들어 낼 수 있습니다. 다만, 데이타베이스의 경우는 대체로 테이블 정보와 인덱스 정보를 분리해서 나타내는 편이지만, 게임의 배경용 모델 파일은 폴리곤 모음 정보와 부가정보가 하나로 합해져 있는 경우가 많기 때문에, 마치 부가정보 자체가 본연의 정보인 것으로 오해하게 되는 것입니다.
대신 포탈같은 경우는 프로그램적으로 어디에 포탈을 배치할지 계산하게 하는 것이 간단한 작업이 아닌 관계로 디자이너가 힌트정보를 주는 것입니다.



>그리고 제 짧은 지식으로는 Indoor와 Outdoor의 분할법이 다르다고 들었는데요,
>온라인게임과 같이 건물내부(Indoor)에서 필드(Outdoor)로 이동이 가능한 게임에서는
>어떤 식으로 공간을 분할하여 사용하는지요.

공간을 분할하는 이유는 폴리곤 데이타로 이루어진 씬들을 신속하게 탐색하기 위함입니다. 씬을 탐색하는 목적에는 여러가지가 있지만 대표적인 것들은 다음과 같습니다

1) View frustum culling - 전체 게임의 씬중에서 현재 내 모니터에 표시될 만큼(View Frustum)의 폴리곤들을 골라내기
2) 충돌체크 - 어떤 오브젝트가 다른 오브젝트와 부딛혔는가 그렇지 않은가 체크하기
3) 광선체크 - 어떤 오브젝트가 다른 오브젝트를 볼 수 있는가 없는가에 대한 체크하기

대체로 체크를 하기 위해서는 탐색의 기준점으로부터 보이는 부분에 대한 것만이 관심대상이 됩니다. 보이지 않는 것을 화면에 찍는다던가, 보이지도 않는것과 충돌체크를 할 일은 없기 때문입니다.

실내와 실외를 주로 구분해서 다루는 이유는, 실내의 경우 '보이지 않는다' 를 정의하기에 좀 더 유리하게 되어있기 때문입니다. 왜냐하면 벽과 지붕등으로 인해서 공간을 나누기 좋게 되어있기 때문에, 포탈이란 것을 배치하기가 용이하기 때문입니다. 포탈의 개념에 대해서는 이미 알고 있는 것으로 간주하겠습니다.

실외라고 해서 포탈을 쓰지 못한다는 얘기는 아닙니다. X-box 용으로 발매되어 많은 관심을 모은 자동차 액션 게임 더블스틸을 보면 실외배경이긴 하지만, 높은 빌딩들로 이루어진 도심지에서 레이싱을 하게 됩니다. 더블스틸의 개발사인 분카샤에 올라온 기술정보에 보면 빌딩 사이의 골목과 교차로사이에 포탈을 설치함으로써, 상당한 효율을 얻었다는 점을 밝히고 있습니다. 하지만 이 경우는, 자동차가 언제나 빌딩의 아래쪽 도로에서만 다닌다는데 의의가 있습니다. 만약 헬리콥터 액션이 되서 빌딩 위로도 헬기가 올라가서 때때로 도심 전체를 볼 수 있게 된다면 포탈을 설치하는 것이 무의미해질 것입니다.

건물 내부에서는 포탈에 의한 PVS (Potentially visible set 현 시점에서 볼 수 있는 장소들의 모음) 방식의 분할&탐색 기법이 유효한 반면에, 실외 배경에서는 '가린다' 라는 이점을 살리기 힘들므로 Oct-tree 같은 단순한 방식을 쓰게 됩니다. 그렇다면 실내와 실외가 혼합된 경우는 어떻게 해야 할까요?

간단하게 생각할 수 있는 방법 한가지는, 실외 자체를 커다란 방으로 보고, 실내의 방들과 섞어서 포탈과 pvs 를 구성하는 것입니다. 실외에서 실내로 들어가는 입구에 포탈을 넣고, 입구를 기준으로 실외를 끊어놓으면, 대체로 원하는 결과에 근접할 수 있습니다. 물론 각 나뉘어진 단위 섹션별로 oct-tree 가 사용되겠죠.

실내와 실외가 혼합된 맵에서 씬 그래프를 이용하는 가장 큰 목적은, 실외에 있을때에는 실내에 있는 안 보일 폴리곤들을 무시하는 것이 가장 중요하다는 것과, 반대로 실내에서 헤멜때 실외에 있는 산이나 평야를 어떻게 하면 찍어야 되나 안찍어도 되나를 판단할 수 있을 것인가입니다. 실외에서 나머지 부분은 oct-tree 에 맡긴다는 상기하면서 머릿속으로 구조를 그려보시면 도움이 될 것입니다.

imcgames 의 김학규입니다