충돌 파일(GTA)
모든 3D 세계관 게임(Grand Theft Auto III, Grand Theft Auto: Vice City, Grand Theft Auto: San Andreas)은 모델의 시각적 및 물리적 표현을 위해 별도의 파일을 사용합니다. 충돌 모델(Collision models)은 종종 시각적 모델을 단순히 최적화하여 폴리곤 수와 복잡도를 줄인 형태입니다. 게임 엔진은 이를 충돌 및 물리 계산에 사용합니다. 그래픽 메쉬와 달리 이들은 삼각형뿐만 아니라 더 빠르고 정확한 충돌 알고리즘이 존재하는 구와 상자 형태로도 구성됩니다.
하나 이상의 충돌 모델은 충돌 파일(collision file)로 패키징되며, 파일 확장자 ".col"로 표시됩니다.
각 충돌 모델은 이름으로 식별되며, 이는 모델 파일 및 아이템 정의의 이름과 동일해야 합니다.
버전 차이
col 형식은 Grand Theft Auto III에서 처음 도입되었으며, 여기서는 '버전 1'로 지칭합니다. 후속작인 Grand Theft Auto: Vice City는 완전히 동일한 형식을 사용했습니다.
하지만 Grand Theft Auto: San Andreas의 PlayStation 2 버전에서는 새로운 버전(버전 2)이 사용되었으며, 이후 PC 및 Xbox 출시판에서 업데이트되었습니다(버전 3).
기능 매트릭스
다음 매트릭스는 3D 세계관 충돌 파일 형식의 알려진 3가지 버전에 대한 심층적인 기능 개요를 제공합니다.
| 기능 | 버전 1 | 버전 2 | 버전 3 |
|---|---|---|---|
| 지원 게임: | |||
| GTA III | Y | N | N |
| GTA Vice City | Y | N | N |
| GTA San Andreas (PS2) | Y | Y | N |
| GTA San Andreas (PC/Xbox) | Y | Y | Y |
| 기하학적 도형: | |||
| 충돌 구(Collision spheres) | Y | Y | Y |
| 충돌 상자(Collision boxes) | Y | Y | Y |
| 충돌 메쉬(Collision mesh) | Y | Y | Y |
| 면 그룹(Face groups) | N | Y | Y |
| 그림자 메쉬(Shadow mesh) | N | N | Y |
| 기타: | |||
| 광원 강도: | N | Y | Y |
| 데이터 압축 | N | Y | Y |
| 4문자 코드 | COLL | COL2 | COL3 |
설명
구버전 1 형식과 신버전 2 및 3 형식의 주요 차이점은 파일 크기 감소입니다. 면과 정점이 절반 크기로 줄어들어 구와 상자가 없는 모델의 경우 거의 50%까지 크기가 줄어듭니다.
또한 면 그룹(face groups)이 도입되어, 적절하게 계산될 경우 대형 모델의 충돌 테스트 속도를 높일 수 있게 되었습니다.
또 다른 새로운 기능은 실시간 조명을 구현하는 간단하지만 효과적인 방법인 광원 강도 값입니다. 면당 1바이트의 조명 값을 정의할 수 있으며, 이를 통해 캐릭터나 차량이 해당 면에 올라섰을 때 밝기가 변하게 할 수 있습니다. 이는 건물 아래 등 태양빛이 닿지 않는 곳의 어둠을 시뮬레이션하는 데 사용됩니다.
마지막으로 버전 3에서는 투영된 그림자를 만드는 데 사용되는 그림자 메쉬가 도입되었습니다. 이는 그림자를 드리우길 원하는 면(예: 교량)만 포함하며, 구나 상자는 사용할 수 없습니다.
하나의 충돌 파일 내에서 원하는 대로 모든 형식을 혼합할 수 있지만, 대상 게임이 모두 지원하는지 확인해야 합니다(위 매트릭스 참조).
파일 형식
위에서 언급했듯이 충돌 파일은 하나 이상의 충돌 모델을 담는 컨테이너입니다. 헤더는 없으며, 모델은 패딩 없이 선형적으로 저장됩니다.
즉, 충돌 파일은 기본적으로 충돌 모델의 배열입니다.
구조
본 문서에서는 다음 데이터 유형과 구조를 사용합니다.
- INT8/UINT8 - 부호 있는/없는 8비트 정수 (1바이트)
- INT16/UINT16 - 부호 있는/없는 16비트 정수 (2바이트)
- INT32/UINT32 - 부호 있는/없는 32비트 정수 (4바이트)
- FLOAT - 단정밀도 부동 소수점 수 (4바이트)
- TVector - float[3] (12바이트)
일부 복잡한 구조는 형식 버전에 따라 다릅니다.
| 구조 이름 | 버전 1 | 버전 2/3 |
|---|---|---|
| TBounds 경계 객체(상자 및 구) (40바이트) |
radius : float; center : TVector; min, max: TVector; |
min, max: TVector; center : TVector; radius : float; |
| TSurface 표면 속성 (4바이트) |
material: uint8; flag : uint8; unknown : uint8; light : uint8; | |
| TSphere 충돌 구 (20바이트) |
radius : float; center : TVector; surface: TSurface; |
center : TVector; radius : float; surface : TSurface; |
| TBox 충돌 상자 (28바이트) |
min, max: TVector; surface : TSurface; | |
| TFaceGroup 면 그룹 (28바이트) |
(사용 안 함) | min, max: TVector; StartFace, EndFace : uint16; |
| TVertex 충돌 메쉬 정점 (12 또는 6바이트) |
float[3] | int16[3] |
| TFace 충돌 메쉬 면 (16 또는 8바이트) |
a, b, c: uint32; surface: TSurface; |
a, b, c : uint16; material: uint8; light : uint8; |
- 모든 상자는 축 정렬(axis-aligned) 방식입니다.
헤더
char {4} - FourCC ("COLL", "COL2" 또는 "COL3")
if (버전 >= 2) {
if (버전 >= 3) {
if (버전 = 4) {
|
- col 2/3 형식의 모든 오프셋은 FourCC 이후를 기준으로 하므로 파일 오프셋 + 4입니다.
- Col 2/3 형식은 정점 개수를 저장하지 않습니다. 일반적으로는 정점 인덱스를 포인터의 오프셋에 더하면 되므로 필요하지 않지만, 꼭 필요하다면 면에서 가장 큰 인덱스를 검색하면 됩니다.
플래그:
- 2 - 비어 있지 않음(충돌 모델에 구, 상자 또는 메쉬가 있음)
- 8 - 면 그룹 있음(비어 있지 않은 경우)
- 16 - 그림자 메쉬 있음(col 3)
- 기타 플래그는 사용되지 않는 것으로 보입니다.
본문
| 버전 1 | 버전 2/3 |
|---|---|
| uint32 {4} - 충돌 구 개수 TSphere[] {*} - 충돌 구 배열 uint32 {4} - 알 수 없는 데이터 개수(0) uint32 {4} - 충돌 상자 개수 TBox[] {*} - 충돌 상자 배열 uint32 {4} - 충돌 정점 개수 TVertex[] {*} - 충돌 메쉬 정점 배열 uint32 {4} - 충돌 면 개수 TFace[] {*} - 충돌 메쉬 면 배열 |
TSphere[] {*} - 충돌 구 배열 TBox[] {*} - 충돌 상자 배열 TVertex[] {*} - 충돌 메쉬 정점 배열 char {2} - 선택적 패딩 FaceGroup[] {*} - 충돌 메쉬 면 그룹 uint32 {4} - 면 그룹 개수 TFace[] {*} - 충돌 메쉬 면 배열 TVertex[] {*} - 그림자 메쉬 정점 배열 char {2} - 선택적 패딩 TFace[] {*} - 그림자 메쉬 면 배열 |
- 알 수 없는 섹션은 난간처럼 매우 얇은 물체와의 충돌을 위해 라인 세트를 보관할 계획이었던 것으로 보입니다. 하지만 확인되지 않았으며 어디에도 사용되지 않습니다.
- col 2/3 형식의 섹션 순서는 모든 파일 예제에서 동일하게 관찰됩니다. 하지만 이제 오프셋이 있으므로 원하는 대로 순서를 정할 수 있습니다.
- 면 그룹으로 가는 오프셋은 없으며 읽기는 선택 사항입니다. 읽으려면 면 배열의 시작 부분으로 이동하여 4바이트를 뒤로 이동하고, 그룹 개수를 읽은 다음 28*그룹개수 바이트만큼 뒤로 이동하면 됩니다. 단, 먼저 헤더의 플래그를 확인하여 면 그룹의 존재 여부를 확인하십시오.
- col 2/3에서 정점 배열 뒤의 2바이트 패딩은 4바이트 정렬을 위해 사용됩니다. 배열 길이가 4로 나뉘지 않는 경우, 즉 (정점 개수*6) mod 4 != 0일 때 존재합니다.
주석
데이터 압축 및 제한
col 2/3 형식에서는 면 인덱스가 공간을 절반만 차지할 뿐만 아니라(uint32 대신 uint16), 정점 좌표도 고정 소수점 수로 저장됩니다.
이러한 int16 수를 부동 소수점 수로 변환하려면 단순히 128.0으로 나누면 됩니다.
하지만 주의해야 할 한 가지 큰 단점이 있습니다. 메쉬는 각 축당 +/- 255.99 단위의 치수로 제한됩니다. 그러나 스트리밍 엔진의 목적을 고려할 때 그보다 큰 객체는 원래 사용해서는 안 되므로 큰 문제는 아닐 것입니다.
면 그룹
대형 col 2/3 메쉬(80개 이상의 면)의 면은 위치별로 그룹화되며 경계 상자를 가집니다. 이렇게 하면 충돌 검사를 특정 관심 영역으로 제한하여 속도를 크게 높일 수 있습니다.
통계: 그룹당 평균 최소 13.8개의 면이 있으며, 최대값은 50개입니다. 평균적으로 그룹당 31.75개의 면이 있습니다.
그룹화 알고리즘에서 50개 초과의 면은 그룹을 분할하는 기준이 됩니다.
그림자 메쉬
버전 3에서 도입된 소위 "그림자 메쉬"는 GTA SA에서 실시간 그림자를 생성하는 데 사용됩니다. 역시 CPU 시간을 절약하기 위해 맵의 교량처럼 객체의 중요한 부분으로만 축소되었습니다. 매우 중요한 점은 이들은 항상 닫혀 있어야 한다는 것입니다! 메쉬에 구멍이 있으면 그림자 삼각형이 공중에 떠다니는 등 이상한 투영 오류가 발생합니다.
충돌 버전 4
Rockstar는 충돌 모델의 버전 4 형식을 계획했지만, 개발 과정에서 폐기된 것으로 보입니다. 이 형식은 충돌 파일 헤더 끝에 4바이트를 추가하지만 용도는 알려지지 않았습니다. GTA:SA 엔진 내부에는 버전 4 형식 로딩의 잔재가 남아 있습니다. 일반적인 방법으로는 기술적인 어려움 때문에 로드할 수 없지만, GTA:SA의 PlayStation 2 버전에서는 로드되었을 가능성이 있습니다.
도구
버전 1 전용
- CollMaker [1] - Steve M. (2002)
텍스트 .x 파일과 같은 텍스트 좌표 입력을 기반으로 단일 모델 충돌 파일을 만드는 매우 간단한 도구입니다. - CollEditor [2] - Steve M. (2003)
충돌 파일을 위한 최초의 3D 편집기입니다. 충돌 모델의 간단한 수정 및 관리를 허용했습니다. 하지만 사용자 친화적이지 않고 버그가 좀 있습니다. - Col IO [3] - Delfi (2004)
또 다른 3D 편집기입니다. CollEditor와 달리 구, 상자, 정점을 마우스로 편리하게 끌어올 수 있습니다. 주로 차량에 적합하며 버그가 꽤 있습니다.
모든 버전
- KAMS [4] - Kam (2005)
충돌 파일 가져오기/내보내기를 포함한 3D Studio Max용 스크립트 모음입니다. 면 그룹은 지원하지 않습니다. - CollEditor II [5] - Steve M. (2005)
많은 기능을 갖춘 또 다른 3D 편집기입니다.
더 보기
| Grand Theft Auto: San Andreas | |
|---|---|
| 정보 | 미션 · 등장인물 · 갱단 · 무기 · 라디오 방송국 · 도전 과제 및 트로피 |
| 지역 | 로스 산토스 · 샌 피에로 · 라스 벤츄라스 · 산 안드레아스 주 |