1. 程式人生 > >使用SDK對FBX模型的載入與讀取

使用SDK對FBX模型的載入與讀取

一.初始化FBX  SDK

FbxManager* pManager = NULL;
FbxScene* pScene = NULL;
pManager = FbxManager::Create();
if( !pManager )
{
//出錯處理
}
FbxIOSettings* ios = FbxIOSettings::Create(pManager, IOSROOT);
pManager->SetIOSettings(ios);
pScene = FbxScene::Create(pManager, "My Scene");
if( !pScene )
{
//出錯處理
}

上面程式碼中出現了KFbxIOSettings類,這是一個用來配置KFbxSdkManage的物件,可以通過這個物件設定一些匯入匯出時的行為,比如可以選擇不匯入材質,動畫等等。

bool LoadScene(FbxManager* pManager, FbxDocument* pScene, const char* pFilename)
{
// Create an importer.
FbxImporter* lImporter = FbxImporter::Create(pManager,"");
//Initialize the importer by providing a filename.
const bool lImportStatus = lImporter->Initialize(pFilename, -1, pManager->GetIOSettings());
if( !lImportStatus )
{
//出錯處理
}
// Import the scene.
lStatus = lImporter->Import(pScene);
// Destroy the importer.
lImporter->Destroy();
return lStatus;
}
 

二.讀取FBX資料

FBX採用的是類似於樹是形式儲存的,因此可以以類似於樹的遞迴方法來遍歷其中的每個結點,並根據結點的屬性選擇合適的處理操作。根節點包含了一系列子節點KFbxNode,每個KFbxNode又有其自己的子節點。KFbxNode包含了座標變換資訊,可以通過一系列get函式取得,其他資料作為KFbxNodeAttribute物件,包含在KFbxNode內部,這裡的其他資料是指mesh,Nurbs,skeletion,camara,light等定義在KFbxNodeAttribute::EAttributeType中的型別。一個KFbxNode可以有多個子KFbxNode ,可以通過KFbxNodeAttribute的GetAttributeType()方法,確定當前node的所包含的實際資料型別:

1.遞迴處理根節點

獲得根結點:KFbxNode* root = scene->GetRootNode();

遞迴處理每個結點: 

void ProcessNode(KFbxNode* pNode) 

{  

if(pNode->GetNodeAttribute())  

{   

switch(pNode->GetNodeAttribute()->GetAttributeType())   

{   

case KFbxNodeAttribute::eMESH:    ProcessMesh(pNode);    break;   

case KFbxNodeAttribute::eSKELETON:    ProcessSkeleton(pNode);    break;   

case KFbxNodeAttribute::eLIGHT:    ProcessLight(pNode);    break;   

case KFbxNodeAttribute::eCAMERA:    ProcessCamera();    break;   

....

}  

}   

for(int i = 0 ; i < pNode->GetChildCount() ; ++i)  

{   

ProcessNode(pNode->GetChild(i));  

}

在FBX的儲存中,每個父結點可以包含多個子結點,但每個子結點只有一個根結點,而且這其中的聯絡是雙向的,這樣很方便,比如在處理Skeleton時就常常需要從子結點中得到父結點的matrix等資訊,而這種雙向關係使得這些操作很容易實現。注意,上述程式碼中有pNode->GetNodeAttribute()檢查操作是必須的,因為並不是所有的結點都有相應的屬性(Attribute也是以子結點的方式關聯到當前的結點上的,因而可能為空)。

2.載入網格

void ProcessMesh(KFbxNode* pNode)   KFbxMesh* pMesh = pNode->GetMesh();  if(pMesh == NULL) { return; }   D3DXVECTOR3 vertex[3];   D3DXVECTOR4 color[3];   D3DXVECTOR3 normal[3];   D3DXVECTOR3 tangent[3];   D3DXVECTOR2 uv[3][2];   int triangleCount = pMesh->GetPolygonCount();  int vertexCounter = 0;   for(int i = 0 ; i < triangleCount ; ++i)   {   for(int j = 0 ; j < 3 ; ++j)   {   int ctrlPointIndex = pMesh->GetPolygonVertex(i , j);  // Read the vertex   ReadVertex(pMesh , ctrlPointIndex , &vertex[j]);   // Read the color of each vertex   ReadColor(pMesh , ctrlPointIndex , vertexCounter , &color[j]);   // Read the UV of each vertex   for(int k = 0 ; k < 2 ; ++k)   {   ReadUV(pMesh , ctrlPointIndex , pMesh->GetTextureUVIndex(i, j) , k , &(uv[j][k]));   // Read the normal of each vertex   ReadNormal(pMesh , ctrlPointIndex , vertexCounter , &normal[j]);   // Read the tangent of each vertex   ReadTangent(pMesh , ctrlPointIndex , vertexCounter , &tangent[j]);   vertexCounter++;   }   // 根據讀入的資訊組裝三角形,並以某種方式使用即可,比如存入到列表中、儲存到檔案等... }

相關推薦

使用SDKFBX模型載入讀取

一.初始化FBX  SDK FbxManager* pManager = NULL; FbxScene* pScene = NULL; pManager = FbxManager::Create();

基於FBX SDKFBX模型解析載入 -(三)

6. 載入Camera和Light 在FBX模型中除了幾何資料外較為常用的資訊可能就是Camera和Light,雖然在遊戲中一般不直接從模型中得到這兩部分資訊,而是由引擎來提供,但是FBX中提供了對這些資訊儲存的支援。其實單純載入這兩部分的資訊很簡單,就像之前介紹的在整

基於FBX SDKFBX模型解析載入 -(二)

5. 載入材質  Material是一個模型渲染時必不可少的部分,當然,這些資訊也被存到了FBX之中(甚至各種貼圖等也可以直接內嵌到FBX內部),就需要從FBX中載入這些資訊以完成帶有材質的渲染。材質的載入可以與Mesh的載入相結合來完成,但更好的方法是獨立進行,這樣各模組

基於FBX SDKFBX模型解析載入

1. 簡介 FBX是Autodesk的一個用於跨平臺的免費三維資料交換的格式(最早不是由Autodesk開發,但後來被其收購),目前被 眾多的標準建模軟體所支援,在遊戲開發領域也常用來作為各種建模工具的標準匯出格式。Autodesk提供了基於C++(還有Python)的SDK來實現對FBX格式的各種讀寫、

C#文字的寫入讀取操作

C#對文字的寫入與讀取操作。 示例:使用txt文字模仿日誌功能的寫入與讀取操作。 1、寫入操作 /// <summary> /// 寫入日誌 /// </summary> public static void WriteLog(string message)

mxnet——模型載入儲存

一、載入模型與pretrain模型network相同 # loading predict module data_shape_G = 96 Batch = namedtuple('Batch',['data']) sym, arg_params, aux_params = mx.mode

Keras中實現模型載入測試(以mnist為例)

 需要安裝cv2 安裝h5py的命令如下(模型載入模組): sudo pip install cython sudo apt-get install libhdf5-dev sudo pip 

Tensorflow+MNIST+CNN+模型儲存讀取

# coding: utf-8 import tensorflow as tf import numpy as np from utils import * from tensorflow.examples.tutorials.mnist import inpu

sklearn、TensorFlow、keras模型儲存讀取

一、sklearn模型儲存與讀取 1、儲存 from sklearn.externals import joblib from sklearn import svm X = [[0, 0], [1, 1]] y = [0, 1] clf = svm.SVC(

DirectX11 With Windows SDK--19 模型載入:obj格式的讀取及使用二進位制檔案提升讀取效率

前言 一個模型通常是由三個部分組成:網格、紋理、材質。在一開始的時候,我們是通過Geometry類來生成簡單幾何體的網格。但現在我們需要尋找合適的方式去表述一個複雜的網格,而且包含網格的檔案型別多種多樣,對應的描述方式也存在著差異。這一章我們主要研究obj格式檔案的讀取。 .obj格式 .obj格式是A

DirectX11 With Windows SDK--22 靜態天空盒的讀取實現、模型反射

前言 從現在開始可以說算是要進入到高階主題部分了。這一章我們主要學習由6個紋理所構成的立方體對映,以及用它來實現一個靜態天空盒。 歡迎加入QQ群: 727623616 可以一起探討DX11,以及有什麼問題也可以在這裡彙報。 立方體對映(Cube Mapping) 一個立方體(通常是正方體)包含六個面,對於

Tensorflow學習筆記:變數作用域、模型載入儲存、執行緒佇列實現多執行緒讀取樣本

# tensorflow變數作用域     用上下文語句規定作用域     with tf.variable_scope("作用域_name")         ......

使用client模型讀取SharePoint列表數據

lis content plist center rgs ext arp app inf 使用client對象模型讀取SharePoint列表數據 client對象模型提供了強有力的方式。從遠程client應用程序管理列表。 1. 管理員身份打開VS,新建項目W

java象創建內存模型總結

對象的引用 創建 生命周期 運行時 強制 地址 class文件 發生 停止 1、JVM管轄的內存大致分為三個邏輯部分:java棧(Heap)、java堆(JavaStack)和方法區(MethodArea)。在JVM啟動時創建,關閉時全部回收。      棧、本地方法棧、

c++txt文件的讀取寫入

lin 一個 離開 term file 例子 內容 存儲 turn 轉自:http://blog.csdn.net/lh3325251325/article/details/4761575 1 #include <iostream> 2 #incl

利用java編寫thrift來inception模型進行訪問部署

thrift就是一個跨語言呼叫的軟體框架。 首先運用thrift生成一個客戶端與服務端檔案,  客戶端:就是設定ip地址等資訊,並呼叫服務端資訊。 import cn.thrift.Tensorflow_Service; import org.apache.thrift.TEx

TensorFlow實現Softmax迴歸(模型儲存載入

1 # -*- coding: utf-8 -*- 2 """ 3 Created on Thu Oct 18 18:02:26 2018 4 5 @author: zhen 6 """ 7 8 from tensorflow.examples.tutorials.mnist imp

tensorflow 訓練模型的儲存 讀取已儲存的模型進行測試

在實際中,通常需要將經過大量訓練的較好模型引數儲存起來,在實際應用以訓練好的模型進行預測。 TensorFlow中提供了模型儲存的模組 tensorflow.train.Saver() 1. 匯入tensorflow模組        

unity動態載入FBX模型(Http下載到Rescources檔案,場景Load直接呼叫):

using UnityEngine; using System.Collections; using System.IO; using System.Net; using System; using UnityEditor;    public class WWWLo

python opencv3.x中支援向量機(svm)模型儲存載入問題

親自驗證,可以解決svm的模型載入問題:     import numpy as np     from sklearn import datasets         &nb