ユーザ用ツール

サイト用ツール

サイドバー

About

Contents

Materials Link

その他

PR


wiki:opengl:tips:014

014 FBXファイルの読み込み

概要

FBXフォーマットは、Autodesk Mayaなどで出力できるクロスプラットフォームのファイル形式です。 有名なファイルフォーマットとしてはXファイルがありましたが生みの親であるはずのMicroSoftが手放したため、 これから3DプログラムをするならFBX形式のモデルフォーマットというものを知っておいた方が良いです。 UnityやUnreal Engine 4なんかでも標準で読み込める形式となっています。

環境構築

  • VisualStudio2010のプロジェクト設定を行います。
    • 追加のインクルードディレクトリ
      • FBX SDK\2014.2\include
    • 追加のライブラリディレクトリ
      • Debug構成 FBX SDK\2014.2\lib\vs2010\x86\debug
      • Release構成 FBX SDK\2014.2\lib\vs2010\x86\release
  • 追加の依存ファイル
    • マルチスレッド デバッグ DLL(/MDd)
      • libfbxsdk-md.lib
    • マルチスレッド デバッグ/MTd)
      • libfbxsdk-mt.lib
    • マルチスレッド DLL(/MD)
      • libfbxsdk-md.lib
    • マルチスレッド(/MT)
      • libfbxsdk-mt.lib

これで環境設定は完了です。

ヘッダーファイル

#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;
}
Permalink wiki/opengl/tips/014.txt · 最終更新: 2014/11/07 07:50 (外部編集)

oeffentlich