FBX 모델 파일 구조 설명
1. FBX 파일 구조
이것은 샘플 FBX 파일입니다.
먼저 알아두어야 할 점은 일부 줄이 세미콜론으로 시작한다는 것입니다. 이는 주석이므로 파일을 읽을 때 무시해야 합니다.
첫 번째 주석 다음에 FBXHeaderExtension이라는 식별자가 나타납니다. 이것은 파일 구조의 첫 번째 주요 노드입니다. FBX 파일 형식은 실제로 다음과 같은 체계를 따르는 트리 구조입니다.

각 노드 또는 자식 노드는 고유한 속성을 가질 수 있습니다. 속성은 메인 노드 외부에도 존재할 수 있지만, 일반적으로 무시해도 됩니다. 일반적으로 노드의 기본 구조는 다음과 같습니다.
노드 이름: eventual_properties {
노드 속성 1: 값
노드 속성 2: 값
서브노드1 : {
하위 노드 속성 1: 값
[…]
}
노드 속성 3: 값
[…]
}
이것은 예제 파일에서 발견된 노드(첫 번째 노드)입니다.
FBXHeaderExtension: {
FBXHeaderVersion: 1003
FBX 버전: 6100
CreationTimeStamp: {
버전: 1000
연도: 2014
월: 3
날짜: 20일
시간: 17시
분: 38
두 번째: 29
밀리초: 0
}
제작자: "FBX SDK/FBX 플러그인 빌드 20070228"
기타 플래그: {
플래그PLE: 0
}
}
구조를 이해하는 것은 효율적인 파서를 작성하는 데 있어 기본입니다.
첫 번째 노드에는 FBXHeaderVersion과 FBXVersion이라는 두 가지 속성이 있으며, 이 속성들의 값은 포맷 버전입니다. 이 경우 버전은 6.1입니다. 생성 날짜(CreationTimeStamp)도 함께 확인하려는 경우가 아니라면 다른 정보는 무시해도 됩니다.
2. FBX 객체 노드
가장 중요한 노드는 단연 객체 노드입니다.
객체 노드에는 모델의 정점, 인덱스, 법선 벡터, UV 좌표 및 재질이 포함되어 있습니다. 구조는 다음과 같습니다.
객체: {
모델: '모델 이름', '메쉬' {
[...]
정점: [...]
PolygonVertexIndex: [...]
LayerElementNormal: { }
LayerElementUV: { }
}
재질: '재질 이름', '' { }
[...]
}
3. FBX 버텍스
앞에서 살펴본 바와 같이, 정점은 모델의 자식 노드의 '정점' 속성에서 찾을 수 있습니다.
구문은 다음과 같습니다.
정점: v1_x, v1_y, v1_z, v2_x, v2_y, v2_z, [...]
각 꼭짓점은 쉼표로 구분된 세 개의 공간 좌표(x, y, z)를 가지고 있습니다(쉼표는 각 꼭짓점을 서로 구분하는 역할을 합니다). 좌표는 소수점 형태로 표시되며, 소수점은 반드시 포함되어야 합니다.
예시는 다음과 같습니다.
정점: 0.000000,0.104800,39.291698,0.000000,0.043400,-44.424301,0.000000,38.654301,-41.818802,-0.000000,39.455002,44.424400
모델을 구성하는 꼭짓점은 다음과 같습니다.
v1(0.000000,0.104800,39.291698)
v2(00.000000,0.043400,-44.424301)
v3(0.000000,38.654301,-41.818802)
v4(0.000000,39.455002,44.424400)
4. FBX 다각형의 꼭짓점 인덱스
인덱스는 PolygonVertexIndex 속성에서 찾을 수 있습니다.
FBX 파일은 삼각형(삼각형) 이상의 다각형을 내보낼 수 있습니다. 대부분의 파일은 사각형(사각형)을 내보냅니다. 구문은 정점과 유사하지만 한 가지 유의해야 할 점이 있습니다.
다각형 정점 인덱스: i1, i2,-i3, i4, i5,-i6,[...]
PolygonVertexIndex: i1, i2, i3, -i4, i5, i6, i7, -i8, [...]
다각형을 구성하는 인덱스는 순서대로 나열되어 있으며, 음수 인덱스는 다각형의 마지막 인덱스를 의미합니다. 인덱스를 양수로 설정한 다음 1을 빼야 합니다!
[이유가 궁금하시다면, 원래 인덱스는 -1일 때만 값이 0이 되는 방식이기 때문입니다. 예를 들어 인덱스 3은 -4가 됩니다.]
예시는 다음과 같습니다.
다각형 정점 인덱스: 8,7,3,-7,4,8,7,-3,0,5,8,-5
모델을 구성하는 다각형은 다음과 같습니다.
p1(8,7,3,6)
p2(4,8,7,2)
p3(0,5,8,4)
다각형의 끝을 나타내는 인덱스가 양수로 설정되어 있으므로, 그 값에서 1을 빼야 합니다.
참고: 그래픽 카드는 사각형을 제대로 처리하지 못하므로, 네 변으로 이루어진 각 다각형은 모델을 표시하기 전에 두 개의 삼각형으로 분할해야 합니다.
5. FBX 노멀
법선 벡터는 Normals 속성의 하위 노드인 LayerElementNormal(이는 다시 Model의 하위 노드임)에서 찾을 수 있습니다. 구문은 정점의 구문과 동일하게 (x, y, z) 좌표의 연속입니다.
법선 벡터: n1_x, n1_y, n1_z, n2_x, n2_y, n2_z, [...]
MappingInformationType 속성에 주의해야 하며, 이 속성은 다음과 같은 값을 가질 수 있습니다.
▪ ByPolygon: 폴리곤별, 즉 모델의 각 폴리곤에 법선이 있다는 의미입니다.
▪ ByPolygonVertex: 폴리곤 정점별로 처리합니다. 즉, 모델의 각 폴리곤의 모든 정점에 법선이 존재합니다. 예를 들어, 모델이 8개의 정점으로 이루어진 4개의 사각형으로 구성되어 있다면, 16개의 법선(법선 1개 * 폴리곤 4개 * 폴리곤 정점 4개)이 생성됩니다. 일반적으로 게임 엔진에서는 정점당 하나의 법선만 필요합니다. 따라서 한 정점에 여러 개의 법선이 있는 경우, 첫 번째 법선 이후의 법선은 무시하거나 모든 법선의 평균을 계산(법선 평활화)할 수 있습니다.
▪ ByVertex: 정점별 처리, 즉 모델의 각 정점에 법선이 부여됩니다. 블렌더 익스포터에서 ByVertice라고 표기하는 경우도 있습니다. 작성자는 스페인 사람인 것 같습니다.
▪ ByEdge: 엣지별로 처리됨. 즉, 모델의 각 엣지에는 일반적인(드문) 처리 방식이 적용됩니다.
▪ AllSame: 이는 모델의 모든 정점이 동일한 법선 벡터를 가진다는 의미인데, 대부분의 모델에서는 드물거나 불가능합니다.
또 다른 중요한 속성은 ReferenceInformationType 속성으로, 다음과 같은 값을 가질 수 있습니다.
▪ 직접: 법선 벡터가 정렬되어 있음을 나타냅니다.
▪ IndexToDirect(또는 이전 FBX 형식 버전에서는 index): 법선 벡터의 순서가 NormalsIndex 속성에 의해 지정됨을 나타냅니다.
아래는 텍스트보다 더 명확한 그림 예시입니다. 예시 모델은 X축과 Y축에 놓인 평면(따라서 모든 꼭짓점의 Z 좌표는 0)으로, 9개의 꼭짓점과 4개의 다각형(사각형)으로 구성됩니다. 예시 이미지는 평면을 위에서 본 모습입니다.

6. FBX UV 좌표
UV 좌표는 자식 노드인 LayerElementUV(Model의 자식 노드)의 UV 속성에서 찾을 수 있습니다. 구문은 정점 및 법선과 유사하지만, 좌표는 세 개가 아닌 두 개입니다.
UV: u1, v1, u2, v2, [...]
MappingInformationType 및 ReferenceInformationType 속성에 여전히 주의를 기울여야 합니다! 이 두 속성은 법선 벡터와 동일한 값을 가질 수 있으므로 동일한 규칙이 적용됩니다. 인덱스 속성(IndexToDirect가 정의된 경우)은 UVIndex입니다.
