소년코딩

FBX Scene

씬 그래프 구조 요약

scene graph

FBX SDK 씬 그래프는 FbxScene 클래스에 의해 추상화됩니다. 씬은 노드 계층 구조로 구성됩니다. 씬의 루트 노드는 FbxScene::GetRootNode() 멤버 함수를 통해 접근합니다. 씬의 요소(mesh, light or camera 등)는 FbxNode와 FbxNodeAttribute의 하위 클래스와 결합하여 정의됩니다.

/* 생략 */

FbxScene* scene = FbxScene::Create(manager, "scene");

// fbx 파일 내용을 scene으로 가져온다.
importer->Import(scene);

/* Global Scene Settings... */

// 씬의 루트 노드를 가져온다.
FbxNode* rootNode = scene->GetRootNode();

Global Scene Settings

씬의 축 시스템, 주변 조명 및 시간 설정은 해당 FbxGlobalSettings 객체에 정의됩니다. 이 객체는 FbxScene::GetGlobalSettings()를 통해 접근합니다.

// 좌표축을 가져온다.
FbxAxisSystem sceneAxisSystem = scene->GetGlobalSettings().GetAxisSystem();

// 씬 내의 좌표축을 바꾼다.
FbxAxisSystem::MayaYUp.ConvertScene(scene);

// 씬 내에서 삼각형화 할 수 있는 모든 노드를 삼각형화 시킨다.
FbxGeometryConverter geometryConverter(manager);
geometryConverter.Triangulate(scene, true);

FBX Nodes

노드는 주로 씬 내의 씬 요소의 위치, 회전 및 크기를 지정하는 데 사용됩니다. 노드는 FbxNode 클래스에 의해 추상화됩니다. FbxScene에는 노드의 부모-자식 계층이 있습니다. 이 트리의 루트 노드는 위에서 설명 했듯이 FbxScene::GetRootNode()를 통해 접근 가능합니다.

노드 계층 구조

노드 계층 구조는 아래와 같은 메서드를 사용하여 탐색할 수 있습니다.

  • FbxNode::GetChild(int n)
  • FbxNode::GetParent()
  • FbxNode::GetChildCount()
// 재귀적으로 노드를 탐색한다.
void LoadNode(FbxNode* node)
{
  // 뭔가의 작업을 수행한다.

  const int childCount = node->getChileCount();
  for(unsigned int i = 0; i < childCount; ++i)
    LoadNode(node->GetChild(i));
};

FbxNode* rootNode = scene->GetRootNode();

LoadNode(rootNode);

노드는 노드의 위치, 회전 및 크기 등의 좌표 데이터를 가지고 있으며, 이는 부모 노드와 관련되어 있습니다. 예를 들어 아래의 그림에서 curNode가 자신의 루트 노드의 x축을 따라 변환되면 lightNode도 변환의 영향을 받습니다. 그러나 cameraNode는 curNode의 하위 노드가 아니므로 영향을 받지 않습니다.

부모 노드와 자식 노드에 회전 및 크기 변환이 적용되는 순서는 노드의 상속 유형(ETransformInheritType)에 의해 지정됩니다.


FBX Node Attributes

씬에 있는 mesh, light, camera 또는 기타 객체는 일반적으로 FbxNodeAttribute의 하위 클래스로 추상화됩니다. (ex. FbxMesh, FbxLight or FbxCamera)

node attributes

FbxNodeAttribute는 씬에서의 위치를 ​​설명하기 위해 FbxNode에 바인딩 됩니다. 이 바인딩 된 노드 속성은 FbxNode::GetNodeAttribute() 멤버 함수를 통해 접근 가능합니다. 해당 노드에 바인딩 된 노드 속성이 없으면 NULL을 반환받습니다.

// 재귀적으로 노드를 탐색한다.
void LoadNode(FbxNode* node)
{
  // 뭔가의 작업을 수행한다.

  FbxNodeAttribute* nodeAttribute = node->GetNodeAttribute();

  if(nodeAttribute)
  {
    if(nodeAttribute->GetAttributeType() == FbxNodeAttribute::eMesh)
    {
      // 이 노드의 속성은 메쉬.
      // 메쉬에 대한 작업을 수행한다.
    }
  }

  const int childCount = node->getChileCount();
  for(unsigned int i = 0; i < childCount; ++i)
    LoadNode(node->GetChild(i));
};

FbxNode* rootNode = scene->GetRootNode();

LoadNode(rootNode);

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

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

최근에 게시된 이야기