About
Contents
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
Materials Link
その他
PR
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
FBXフォーマットは、Autodesk Mayaなどで出力できるクロスプラットフォームのファイル形式です。 有名なファイルフォーマットとしてはXファイルがありましたが生みの親であるはずのMicroSoftが手放したため、 これから3DプログラムをするならFBX形式のモデルフォーマットというものを知っておいた方が良いです。 UnityやUnreal Engine 4なんかでも標準で読み込める形式となっています。
これで環境設定は完了です。
#pragma once #include <fbxsdk.h> class CFBXModel { private: // FBX SDK オブジェクト。 FbxManager* m_pFbxManager; FbxScene* m_pFbxScene; FbxImporter* m_pFbxImporter; public: // //! コンストラクタ。 // CFBXModel(); // //! デストラクタ。 // ~CFBXModel(); private: // //! ポリゴンの三角形化。 // void TriangulateRecursive( FbxNode* _pNode, FbxScene* _pScene ); // //! FBX オブジェクトの 初期化。 // bool InitializeSdkObjects(); public: // //! FBX読み込み。 // bool Load( const char* _pName, FbxAxisSystem _axis ); // 解放。 void Releae(); };
//---------------------------------- ----------------------------------------------// // CFBXModel.cpp //--------------------------------------------------------------------------------// #include "CFBXModel.h" // コンストラクタ CFBXModel::CFBXModel() { m_pFbxManager = NULL; m_pFbxScene = NULL; m_pFbxImporter = NULL; } // デストラクタ CFBXModel::~CFBXModel() { Releae(); } // FBXデータ解放。 void CFBXModel::Releae() { if( m_pFbxImporter ) { m_pFbxImporter->Destroy(); m_pFbxImporter = NULL; } if( m_pFbxScene ) { m_pFbxScene->Destroy(); m_pFbxScene = NULL; } if( m_pFbxManager ) { m_pFbxManager->Destroy(); m_pFbxManager = NULL; } } // ポリゴンの三角形化。 void CFBXModel::TriangulateRecursive( FbxNode* _pNode, FbxScene* _pScene ) { FbxNodeAttribute* pNodeAttribute = _pNode->GetNodeAttribute(); if ( pNodeAttribute ) { FbxNodeAttribute::EType type = pNodeAttribute->GetAttributeType(); if (type == FbxNodeAttribute::eMesh || type == FbxNodeAttribute::eNurbs || type == FbxNodeAttribute::eNurbsSurface || type == FbxNodeAttribute::ePatch) { FbxGeometryConverter lConverter( _pNode->GetFbxManager() ); lConverter.Triangulate( _pScene, true ); } } const int lChildCount = _pNode->GetChildCount(); for ( int lChildIndex = 0; lChildIndex < lChildCount; ++lChildIndex ) { // 子ノードを探索。 TriangulateRecursive(_pNode->GetChild( lChildIndex ), _pScene ); } } // FBX オブジェクトの 初期化。 bool CFBXModel::InitializeSdkObjects() { // マネージャ作成。 m_pFbxManager = FbxManager::Create(); if( !m_pFbxManager ) { FBXSDK_printf( "Error: Unable to create FBX Manager!\n" ); return false; } else { FBXSDK_printf( "Autodesk FBX SDK version %s\n", m_pFbxManager->GetVersion() ); } // IOSettings オブジェクト作成。 このオブジェクトは全てのインポート/エクスポートの設定を保持します。 FbxIOSettings* pIOS = FbxIOSettings::Create( m_pFbxManager, IOSROOT ); m_pFbxManager->SetIOSettings( pIOS ); // 実行可能なディレクトリ(オプション)からプラグインをロードします。 FbxString lPath = FbxGetApplicationDirectory(); m_pFbxManager->LoadPluginsDirectory( lPath.Buffer() ); // シーン作成。 m_pFbxScene = FbxScene::Create( m_pFbxManager, "Scene" ); if( !m_pFbxScene ) { FBXSDK_printf( "Error: Unable to create FBX scene!\n" ); return false; } return true; } // FBXファイルの読み込み bool CFBXModel::Load( const char* _pName, FbxAxisSystem _axis ) { int sFileFormat = -1; // FBX SDK オブジェクトの初期化。 InitializeSdkObjects(); // インポータ作成。 m_pFbxImporter = FbxImporter::Create( m_pFbxManager, "Importer" ); if( !m_pFbxImporter ) { FBXSDK_printf( "Error: Unable to create FBX importer!\n" ); return false; } // ファイルを指定したインポート(リーダー)ファイル形式で検出します。 if ( !m_pFbxManager->GetIOPluginRegistry()->DetectReaderFileFormat( _pName, sFileFormat ) ) { // 検出できないファイル形式です。 FbxImporter::eFBX_BINARY 形式でトライします。 sFileFormat = m_pFbxManager->GetIOPluginRegistry()->FindReaderIDByDescription( "FBX binary (*.fbx)" ); } // FBXファイルを読み込む。 if( !m_pFbxImporter->Initialize( _pName, sFileFormat ) ) { FBXSDK_printf( "Error: Unable to create FBX initialize!\n" ); return false; } // FBX ファイルのバージョン取得。 int major, minor, revision; m_pFbxImporter->GetFileVersion( major, minor, revision ); FBXSDK_printf( "FBX VERSION %d %d %d\n", major, minor, revision ); // 読み込んだFBXファイルからシーンデータを取り出す。 if( !m_pFbxImporter->Import( m_pFbxScene ) ) { FBXSDK_printf( "Error: Unable to create FBX import!\n" ); return false; } // 軸の設定。 FbxAxisSystem OurAxisSystem = FbxAxisSystem::DirectX; if( _axis == FbxAxisSystem::OpenGL ) { OurAxisSystem = FbxAxisSystem::OpenGL; } // DirectX系に変換。 FbxAxisSystem SceneAxisSystem = m_pFbxScene->GetGlobalSettings().GetAxisSystem(); if( SceneAxisSystem != OurAxisSystem ) { FbxAxisSystem::DirectX.ConvertScene( m_pFbxScene ); } // 単位系の統一。 FbxSystemUnit SceneSystemUnit = m_pFbxScene->GetGlobalSettings().GetSystemUnit(); if( SceneSystemUnit.GetScaleFactor() != 1.0f ) { // センチメーター単位にコンバートする。 FbxSystemUnit::cm.ConvertScene( m_pFbxScene ); } // 三角形化(データによっては、四角形ポリゴンとか混ざっている場合がある) TriangulateRecursive( m_pFbxScene->GetRootNode(), m_pFbxScene ); return true; }