(원문을 번역함)
< MAP 파일>
1. 맵 파서 디자인
이제 맵 파일 형식에 대해서는 알게 되었고, 이제 우리가 어떻게 .MAP 파일 파서를 코딩할 것인가에 대해 생각해 보자.
.MAP 파일을 파싱해서 나오는 결과물은 엔터티들의 집합이어야 한다. 각각의 엔터티들은 속성과 폴리곤들을 가지고 있어야 한다. 이는 어떤 .MAP파일이든지 간에 크게 다르지 않다는 점을 알아두자. 문제는 지오메트리로 저장하는 대신 폴리곤의 목록들(리스트)로 저장한다는 점이며, .MAP 파일은 평면(PLANE)으로 정의된 볼록다각형들인 브러시들로 구성되 었다.
따라서 .MAP 파일 파서 작업은 메모리에 .MAP 파일을 로드하고, 엔터티 안에 있는 브러시들을 폴리곤의 집합과 수정된 엔터티 목록으로 변환을 하는 것이 된다.
다음 그림은 월드크래프트에서 사용하는 좌표계 시스템이다.
월드크래프트에서 사용하는 좌표계를 왼손 좌표계로 바꾸려면 Y와 Z값을 바꾸어 주도록 한다.
만일 브러시들이 볼록다각형(CONVEX)일 경우, 복잡한 건물과 오브젝트들을 어떻게 만들것인가 궁금할 것이다.
첫째로, 이미 알고 있다시피 각각의 엔터티들은 한 개 이상의 브러시를 가지고 있다. 만일 두개의 컨벡스 POLYHEDRA를 서로 옆에 놓는다면 훨씬더 복잡한 오목(concave) polyhedron을 구성할 수 있을 것이다. 그러나 폴리곤들은 실제 객체 내부에 존재할 것이다.
좀 더 이해를 돕기 위하여, 두 개의 육면체(cube)가 서로 이웃하여 나란히 붙어있다고 상상해보자. (이 육면체들은 한 축이 나머지 보다 더 긴 사각형 모양으로 되어 있다고 하자.) (직사각형 모양이라는 말이겠지.그냥 그림을 설명한 말.) 그러나 닿은 두 면들은 새로운 오브젝트 내부에 있게 될 것이다( 두 육면체가 붙어있으니 새로운 오브젝트가 될 것이며 각각 육면체의 닿은 면들(두개)은 그 오브젝트 내부에 있다는 말이다)
얘들은 실제 눈에 보이는 애들이 아니기 때문에 이러한 면을 저장하는데 메모리 낭비가 생긴다. 두번째로 이러한 종류의 지오메트리는 bsp를 컴파일하는데 맞지 않다. ( bsp 빌드적인 의미에서 옳지 않다. –어차피 사용안되는 거니 빌드상으로 illegal 하다는거지.. )
이 설명에 대한 그림이 다음과 같다.
이러한 문제는 CSG 연산을 사용하여 해결할 수 있다. CSG 작업은 오브젝트 내부에 있는 모든 폴리곤들을 제거하게 되고, 불필요한 지오메트리를 제가하는 동안 두개의 다면각형들을 연결하도록 할 것이다.
우리가 .MAP 파일 파서를 작성할 때 직면하는 또 다른 문제는 정확성이다.
시작부터, 여기서는 float 대신 double형을 쓰기로 결정했다. 이는 좀 더 나은 정확성을 위해서이다. 여전히 반올림에 대한 오류는 어느 정도(스멀스멀 ㅋㅋ) 남아있고, 결국 좌표계들은 부정확하게 될 것이다. 이러한 문제를 해결하기 위해서, 엡실론이라는 것을 도입한다.
0과 같은 정확한 값으로 테스트하는 대신에, 0에 대해(0을 중심으로) 특정 범위 내에 있는 값으로 테스트 하는 것이다. 이는 좋든 싫든 필요하다. 이 글 전체의 Pseudo 코드에서는 엡실론 값들을 사용하지 않았다. 왜냐하면 엡실론 값은 여러분 각자의 world 크기와 넓이 뿐만 아니라 데이터에 의거하기 때문이다.(니들이 사용하는 맵의 크기와 넓이와 데이터에 따라 달라지기 때문에, 그 데이터에 의존하기 때문이다)
언제, 어떻게 이 값들을 사용할 것인가에 대한 아이디어를 얻으려면, 소스코드를 살펴보고, 특히 수학과 classify하는 루틴을 살펴보도록 한다. ‘Fuzzy’ 비교는 두 숫자를 비교할 때 뿐만 아니라 두 벡터를 비교 할 때도 사용될 수 있다. 예를 들면, 노말라이즈된 두 벡터가 같은가를 체크하려면 a · b » 1 와 같이 체크하면 된다. 이것을 하는 법을 pseudo 코드로 보면 다음과 같다.
if ( ( Angle > -epsilon ) && ( Angle < epsilon ) )
{
…they are equal…
}
다음은 .map 파일을 파싱하는 주요단계이다.
l 메모리에 .MAP 파일 로드하기
l 브러시들로부터 폴리곤을 생성하기
l 하나의 엔터티에서 각 브러시마다 CSG 연산 수행하기
l 원하는 포맷으로 엔터티 목록들을 저장하기
자 그러면 위의 목록대로 해보자…
투비 컨티뉴드 ~_~
'Coding > Game Programming' 카테고리의 다른 글
.MAP 파일로 만드는 BSP (4) - 텍스처 좌표 계산하기 (0) | 2010.11.25 |
---|---|
.MAP 파일로 만드는 BSP (3) - 맵 파일 구조 (1) | 2010.11.18 |
.MAP 파일로 만드는 BSP (CSG 이용) (2) - 브러쉬를 폴리곤으로 바꾸기 (0) | 2010.11.18 |
[스크랩] 게임 해킹, 아는 만큼 막을 수 있다. (0) | 2009.07.19 |
게임 소스/ 엔진/ 관련 툴 : 소스제공 링크 (0) | 2009.07.19 |