2020년 7월 1일 수요일

FBX 구조

적다 보니까 남들에겐 도움 안되겠다.

FBX 실전에는 느리다고 써먹지도 못하지만, 3D 모델이 어떻게 생겨먹었는지 이해하긴 쉽다고 학원에서 가르쳤어요. 근데 복습하려고 하니까 글로 정리하고 싶어졌어요. 근데 학원 코드 들고 오면 안되잖아요? 그래서 공식 페이지 뒤져보면서 복습합니다. 코드는 공식 페이지랑은 조금씩 달라요.

우선 저기서 (난 윈도우므로) 윈도우 다운받아줍니다.

C:\Program Files\Autodesk\FBX\FBX SDK\2019.0\lib\vs2015\x86\release

여기서 lib, dll 을 꺼내주고

C:\Program Files\Autodesk\FBX\FBX SDK\2019.0\include

여기있는 폴더에 있는 걸 include 할 것이므로 적당히 옮겨서 프로젝트 설정의 추가 디렉토리 설정을 해줍시다.

1

2

3

4

5

6

7

8

9

10

11

12

#define FBXSDK_SHARED

#include <fbxsdk.h>

#pragma comment(lib, "libfbxsdk.lib")

using namespace fbxsdk;

// Create the FBX SDK manager

FbxManager* lSdkManager = FbxManager::Create();

// Create an IOSettings object. IOSROOT is defined in Fbxiosettingspath.h.

FbxIOSettings * ios = FbxIOSettings::Create(lSdkManager, IOSROOT );

(*(lSdkManager->GetIOSettings())).SetBoolProp(IMP_FBX_TEXTURE, true);

lSdkManager->SetIOSettings(ios);

처음은 Manager 를 생성하고, 그리고 IO를 세팅해줍니다.

문서를 보면 IOSetting 에 텍스쳐, material, 애니메이션 등등이 있는데 초기값은 true 라서 없어도 되긴 함.

만약 빼고 싶은게 있으면 false 로 빼면 됨.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// Create an importer.

FbxImporter* lImporter = FbxImporter::Create(lSdkManager, "");

// Declare the path and filename of the file containing the scene.

// In this case, we are assuming the file is in the same directory as the executable.

const char* lFilename = "file.fbx";

// Initialize the importer.

bool lImportStatus = lImporter->Initialize(lFilename, -1, lSdkManager->GetIOSettings());

// Create a new scene so it can be populated by the imported file.

FbxScene* lScene = FbxScene::Create(lSdkManager,"myScene");

// Import the contents of the file into the scene.

lImporter->Import(lScene);

// The file has been imported; we can get rid of the importer.

lImporter->Destroy();

모든 데이터는 Scene 에 저장되어 있습니다. 딱히 어려운게 없으므로 설명 생략.

FbxModel 은 아래에서 무료로 쓰이는걸 사용했음.

Scene 생성하면서 fbx 확장자가 텍스쳐 이미지 파일을 근처에 풀어놓는 걸 확인 할 수 있으니 주의.

FbxAxisSystem::DirectX.GetCoorSystem() 는 위 이미지들에 한에선 Maya 껄 사용합니다. 이게 뭐냐면 오른손 좌표계를 사용한다는 것. DirectX 는 왼손 좌표계를 사용합니다. DirectX 를 나는 사용하므로, 이를 해결하려면 z 와 x 좌표를 반전 시켜야합니다. 그리고 정점의 순서도 시계 반대방향을 Maya 는 사용하는데, DirectX 는 시계방향을 사용한다. 자세한건 네이버 검색.

사실 이 글을 쓰는 이유는 Scene 내의 데이터가 어떻게 있는지 정리하기 위해섭니다. 기타 옵션 정리는 귀찮으니 뺄래요.

Scene

-> GetMaterial(i); => FbxSurfaceMaterial*

-> GetRootNode()

-> FillAnimStackNameArray()

FbxNode

-> GetChild(i)

-> GetName()

-> GetNodeAttribute()

-> GetAttributeType()

-> EvaluateLocalTransform()

-> GetMesh()

FbxMesh*

=> GetControlPointAt(i) ; 위치

=> GetDeformer() ; 뼈

=> GetElementNormal() ; 노말

=> GetPolygonVertex() ; 정점

=> GetLayer() ; 여기에 uv 가 들어가 있음

FbxSurfaceMaterial

=> FbxSurfaceLambert (자식)

=>=> FbxSurfacePhong (의 자식)

-> FindProperty ( FbxSurfaceMaterial::sDiffuse )

댓글 없음:

댓글 쓰기

List