Meshs
메쉬란 다각형(polygon)으로 만들어진 지오메트리입니다. FBX SDK 에서 메쉬 클래스는 필요에 따라 n 면의 다각형으로 형상을 정의할 수 있으므로 사용자는 삼각형, 사각형 등의 기타 다각형을 자유롭게 혼합할 수 있습니다.
메쉬는 FbxMesh 클래스에 의해 추상화됩니다. 메쉬는 흔히 정점(vertices)으로 불리는 제어점(control point)의 리스트로 정의됩니다. FbxMesh의 싱글 인스턴스는 메모리 소비를 줄이기 위해 FbxNode의 여러 인스턴스에 바인딩 될 수 있습니다. 메쉬는 노멀 맵, 재질 맵, 텍스쳐 맵 등을 정의하기 위해 레이어 및 레이어 요소(Layer element) 개념을 사용합니다.
- 제어점(control point)은 XYZ좌표이며 꼭짓점과 같습니다.
- polygon vertex는 제어점(control point)에 대한 index입니다. (동일한 제어점은 여러개의 polygon vertex에 의해 참조될 수 있습니다.)
- polygon은 polygon vertex의 그룹입니다. polygon을 정의하기 위한 최소 유효 polygon vertex의 수는 3개 입니다.
FbxNode::GetMesh() 멤버 함수를 호출해 FbxMesh로 캐스팅된 노드 속성의 포인터를 가져올 수 있습니다.
// 재귀적으로 노드를 탐색한다.
void LoadNode(FbxNode* node)
{
// 뭔가의 작업을 수행한다.
FbxNodeAttribute* nodeAttribute = node->GetNodeAttribute();
if(nodeAttribute)
// 이 노드의 속성은 메쉬.
if(nodeAttribute->GetAttributeType() == FbxNodeAttribute::eMesh)
{
// FbxMesh로 캐스팅된 노드 속성의 포인터를 가져온다.
FbxMesh* mesh = node->GetMesh();
}
}
const int childCount = node->getChileCount();
for(unsigned int i = 0; i < childCount; ++i)
LoadNode(node->GetChild(i));
};
/* 생략... */
FbxNode* rootNode = scene->GetRootNode();
LoadNode(rootNode);
제어점(control point)으로부터 정점의 위치 얻기
위에서 메쉬의 control point를 설명했는데 이것은 정점의 리스트입니다.
vec3* positions = nullptr;
void ProcessControlPoints(FbxMesh* mesh)
{
// 제어점의 개수를 가져온다.
unsigned int count = mesh->GetControlPointsCount();
positions = new vec3[count];
for(unsigned int i = 0; i < count; ++i)
{
vec3 position;
// 제어점을 가져오려면 GetControlPointAt(int index) 멤버 함수를 이용한다.
position.x = static_cast<float>(mesh->GetControlPointAt(i).mData[0]); // x좌표
position.y = static_cast<float>(mesh->GetControlPointAt(i).mData[1]); // y좌표
position.z = static_cast<float>(mesh->GetControlPointAt(i).mData[2]); // z좌표
}
}
/* 생략 Start */
FbxMesh* mesh = node->GetMesh();
ProcessControlPoints(mesh);
/* 생략 End */
삼각형의 개수 얻기
이전에 3 포스팅에서 씬 내에서 삼각형화 할 수 있는 모든 노드를 삼각형화 시킨 적 있습니다. 따라서 현재 메쉬의 모든 polygon은 삼각형으로 구성되어 있습니다.
ProcessControlPoints(mesh);
unsigned int triCount = mesh->GetPolygonCount(); // 메쉬의 삼각형 개수를 가져온다.
정점의 개수와 제어점 인덱스 얻기
fbx 파일 안에 사각형 메쉬가 하나 존재한다면 제어점(cotrol point)은 4개가 될 것입니다. 그러나 사각형 메쉬는 삼각형 두 개로 표현되므로 정점의 개수는 6개가 됩니다. FBX SDK에서 제어점과 정점의 차이는 위와 같습니다. 아래의 코드로 정점의 개수와 제어점 인덱스를 얻을 수 있습니다.
/* 생략 ... */
vec3* positions = nullptr; // 정점 위치 리스트
ProcessControlPoints(mesh); // 제어점으로부터 위치 리스트를 채운다.
unsigned int triCount = mesh->GetPolygonCount(); // 메쉬의 삼각형 개수를 가져온다.
unsigned int vertexCount = 0; // 정점의 개수
for(unsigned int i = 0; i < triCount; ++i) // 삼각형의 개수
{
for(unsigned int j = 0; j < 3; ++j) // 삼각형은 세 개의 정점으로 구성
{
int controlPointIndex = mesh->GetPolygonVertex(i, j); // 제어점 인덱스를 가져온다.
vec3& position = positions[controlPointIndex]; // 현재 정점에 대한 위치
vertexCount++; // 정점의 개수++
}
}