FBX SDK 小筆記之方法篇 II (Ver 1)

天哪~這段重打N次了…
接續上篇「FBX SDK 小筆記之方法篇
這篇開始不程式碼部分不加入顏色,這樣才能多塞點字…


設定匯入的檔案格式

 bool KFbxStreamOptionsFbxReader::SetOption ( KString& pName, T const& pValue )

 pName  要設定的選項名稱。
 pValue  要設定的數值。

 // pSdkManager 是 SDK 管理員的指標
 KFbxStreamOptionsFbxReader* lImportOptions = KFbxStreamOptionsFbxReader::Create(pSdkManager, "");
 lImportOptions->SetOption(KFBXSTREAMOPT_FBX_MATERIAL, true);
 lImportOptions->SetOption(KFBXSTREAMOPT_FBX_TEXTURE, true);
 lImportOptions->SetOption(KFBXSTREAMOPT_FBX_LINK, true);
 lImportOptions->SetOption(KFBXSTREAMOPT_FBX_SHAPE, true);

基本上,所有 true/false 的選項預設值都是 true。
選項的細目詳見 SDK 文件,連結
嗯…它沒斷行,有點難看懂,在這列表方便看。
有留原文的部分我不知道怎樣翻比較好

 KFBXSTREAMOPT_FBX_CURRENT_TAKE_NAME : 目前 take 的名稱
 KFBXSTREAMOPT_FBX_PASSWORD : 密碼
 KFBXSTREAMOPT_FBX_PASSWORD_ENABLE : 是否啟用密碼
 KFBXSTREAMOPT_FBX_MODEL : 是否匯入模型
 KFBXSTREAMOPT_FBX_TEXTURE : 是否匯入紋理
 KFBXSTREAMOPT_FBX_MATERIAL : 是否匯入材質
 KFBXSTREAMOPT_FBX_MEDIA : 是否匯入媒體檔
 KFBXSTREAMOPT_FBX_LINK : 是否匯入連結
 KFBXSTREAMOPT_FBX_SHAPE : 是否匯入形狀
 KFBXSTREAMOPT_FBX_GOBO : 是否匯入 gobo
 KFBXSTREAMOPT_FBX_ANIMATION : 是否匯入動畫
 KFBXSTREAMOPT_FBX_CHARACTER : 是否匯入角色
 KFBXSTREAMOPT_FBX_GLOBAL_SETTINGS : 是否匯入全域設定
 KFBXSTREAMOPT_FBX_PIVOT : 是否匯入 pivot
 KFBXSTREAMOPT_FBX_MERGE_LAYER_AND_TIMEWARP : 是否合併階層和 timewarp
 KFBXSTREAMOPT_FBX_CONSTRAINT : 是否匯入 constrain
 KFBXSTREAMOPT_FBX_MODEL_COUNT : 模型數量
 KFBXSTREAMOPT_FBX_DEVICE_COUNT : 設備數量
 KFBXSTREAMOPT_FBX_CHARACTER_COUNT : 角色數量
 KFBXSTREAMOPT_FBX_ACTOR_COUNT : 演員數量
 KFBXSTREAMOPT_FBX_CONSTRAINT_COUNT : constrain的數量
 KFBXSTREAMOPT_FBX_MEDIA_COUNT : 媒體檔數量
 KFBXSTREAMOPT_FBX_TEMPLATE : 是否匯入模板


KFbxIO 的錯誤碼清單

 typedef enum
  {
       eFILE_CORRUPTED, // 檔案損毀
       eFILE_VERSION_NOT_SUPPORTED_YET, // 可能不支援的版本
       eFILE_VERSION_NOT_SUPPORTED_ANYMORE, // 無法支援的版本
       eFILE_NOT_OPENED, // 無法開啟
       eFILE_NOT_CREATED, // 無法創造
       eOUT_OF_DISK_SPACE, // 超出硬碟空間
       eUNINITIALIZED_FILENAME, // 無法辨識的檔名
       eUNIDENTIFIED_ERROR, // 沒有定義的錯誤
       eINDEX_OUT_OF_RANGE, // 索引超出範圍
       ePASSWORD_ERROR, // 密碼錯誤
       eSTREAM_OPTIONS_NOT_SET, // 串流選項沒有設定
       eEMBEDDED_OUT_OF_SPACE, // 崁入媒體檔超出空間
       eERROR_COUNT // 數量錯誤
  } EError;


希望別又是語法錯誤~"~

–To be continue

FBX SDK 小筆記之方法篇 (Ver 3)

這篇就收集一些用過的方法(函式)
一樣是邊看邊加,慢慢累積嚕


創造 SDK 管理員

宣告:

 static KFbxSdkManager* KFbxSdkManager::Create ( )


參數:

 無參數


使用範例:

 KFbxSdkManager* lSdkManager;
 lSdkManager = KFbxSdkManager::Create();


摧毀 SDK 管理員

 virtual void KFbxSdkManager::Destroy ( )

 無參數


 KFbxSdkManager* lSdkManager;
 lSdkManager->Destroy();



取得目前 SDK 所使用的 FBX 版本編號

 static void KFbxIO::GetCurrentVersion ( int& pMajor, int& pMinor, int& pRevision )

 pMajo  版本開頭的號碼(主要)
 pMinor  版本中間的號碼(次要)
 pRevision  版本結尾的號碼(修訂)

 int lSDKMajor, lSDKMinor, lSDKRevision;

 // 取得 FBX SDK 使用的的版本資訊
 KFbxIO::GetCurrentVersion(lSDKMajor, lSDKMinor, lSDKRevision);



創造 SDK 物件

SDK 物件的創造(Create)幾乎都是在巨集裡面寫的
KFbxScene 類別裡面定義一行 KFBXOBJECT_DECLARE(KFbxScene, KFbxDocument);

在 kfbxobject.h 裡面約第 98 行有定義 #define KFBXOBJECT_DECLARE(Class,Parent)
其中裡面的 Create() 如下

 static Class* Create(KFbxObject *pContainer, char const *pName);


 pContainer  該類別容器的指標
 pName  容器的名稱

 // 以場景(KFbxScene)為例
 KFbxSdkManager* lSdkManager;
 KFbxScene* lScene;

 lScene = KFbxScene::Create(lSdkManager, "名稱");



檢測檔案格式

 bool KFbxIOPluginRegistry::DetectFileFormat ( const char * pFileName, int& pFileFormat ) const


 pFileName  要被檢測的檔案。
 pFileFormat  如果方法回傳 true,則變更為格式的名稱。其他狀況就不做任何改變。


 // pSdkManager 是一個 SDK 管理員
 // GetIOPluginRegistry() 可以取得檔案格式的註冊管理員

 // pFilename 是要被檢測的檔案路徑
 // lFileFormat 接收結果的字串

 // 檢測匯入檔案的格式
 if (!pSdkManager->GetIOPluginRegistry()->DetectFileFormat( pFilename, lFileFormat ))
 { // 做些事情 }



好像真的超過了= =…
下篇以後顏色盡可能簡單了,不然好像塞不了多少字
這編輯器對字型的處理方是真的有夠…
有空看看一下原始碼就知道了…

FBX SDK 小筆記之方法篇 II

–End

FBX SDK 探索筆記(Ver 4)

Autodesk FBX 
上禮拜明峻哥給了任務,心血來潮就去官網晃一下,沒想到有新版
蠻好奇版本編號怎樣設定的,竟然是 2009.1 版,老媽!我穿越未來啦!

上一個版本是 2006.11 ,之前並沒有很深入它,不確定有哪些大改變
進入正題~


連結函式庫的注意事項

因為要給美術範例檔測試才發現這問題的XD

要在別人電腦也能執行的設定重點:
   
[專案屬性] > [組態屬性] > [C/C++] > [程式碼產生] > [執行階段程式庫]

直接改成「多執行緒(/MT)」之後,編譯不會有問題
但開始連結函式庫就出現…

1>正在連結…
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _memmove 已在 LIBCMT.lib(memmove.obj) 中定義過了
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: __stricmp 已在 LIBCMT.lib(stricmp.obj) 中定義過了
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _strchr 已在 LIBCMT.lib(strchr.obj) 中定義過了
1>MSVCRT.lib(MSVCR90.dll) : error LNK2005: _strpbrk 已在 LIBCMT.lib(strpbrk.obj) 中定義過了


的這種錯誤訊息

搞了老半天,最後發現只是一個小小的問題…

    [專案屬性] > [組態屬性] > [連結器] > [輸入] > [其他相依性]

把範例程式裡面所引用的 lib 一一測試,最後是「fbxsdk_md2008.lib」在搞鬼
找到 SDK 函式庫的資料夾,裡面放著一堆等我很久的答案「各種版本的 lib」
我是使用 VS 2008多執行緒(/MD) ,所以將使用的 lib 換成 「fbxsdk_mt2008.lib
OK!問題就解決了!

最後的重點就是「依照編譯器版本以及執行階段程式庫的模式,選用適當的 Library


一個詭異的小問題

在測試 ViewScene 這個範例時,有時候不知道怎樣它會無法辨識檔案
也就是出現…「Unable to open file humanoid.fbx」的錯誤訊息

如果重新執行一次還是無法解決,解決方法很簡單
就是對 humanoid.fbx 手動作一次「重新命名」的動作

就能正常執行了


Scene

場景(Scene)是一個包含模型(例如:網格)、攝影機、燈光等等 3D 物件的容器。一個 FBX 檔案只會有一個場景。


Take

Take 這個概念是用在 MotionBuilder 和 FBX 裡,但許多 3D 工具都沒使用,包括 3ds Max 和 Maya。對於支援 FBX SDK 2009.1 版本的檔案來說,只有 FBX 可以容納多個 take 。其他檔案可以包含動畫曲線資料,但他們不能儲存額外的 take 資料,這也讓他們只能包含相當於一個 FBX take 的資料。



嵌入媒體檔(Embedded Media files)

除了二進位(binary) FBX 檔以外,ASCII FBX 檔、OBJ 檔以及其他支援 FBX 的檔案格式都不能夾帶媒體檔。

如果媒體檔夾帶在二進位的 FBX 檔案裡,當你匯入檔案進入程式中,FBX SDK 匯入員物件會將媒體檔抽出來,並將它們複製到一個資料夾裡。預設是:

  • 存放媒體檔的資料夾,會是 FBX 檔案所在資料夾的子目錄
  • 子目錄的名稱通常基於 FBX 檔案的名稱。舉例來說,有個叫做 MyScene.fbx 的 FBX 檔,子目錄的名稱就會是 MyScene.fbm

如果不是選擇崁入媒體檔,FBX SDK 搜尋媒體檔的方式如下:

  • 先依照絕對位置去找。這是在匯出時,呼叫 SetFileName() 設定的。
    ※注意,這裡的絕對位置是以 FBX 檔為基準點。
  • 倘若沒找到,接著用相對路徑去找。這是在匯出時,可以設定相對路徑的基準點,基準點會存在 FBX 檔案裡面。


FBX SDK 裡的一些術語

這是在 KFbxMesh 裡面提到的。

  • 一個控制點(Control Point)是一個 XYZ 座標,它等同於頂點(Vertex)。
  • 一個多邊形的頂點(Polygon Vertex)是一個控制點的索引(Index),它等同於頂點索引(Vertex Index)。
  • 一個多邊形是控制點索引的群集(集合,Group)。


繼續探索…
話說,FBX 中文資料真的少得可憐QQ
有任何不錯的 FBX 文章請務必賞給小弟,在此拜託了!

–To be continue