소년코딩

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++; // 정점의 개수++
  }
}

fbx file


댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기