使用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++; } // 根據讀入的資訊組裝三角形,並以某種方式使用即可,比如存入到列表中、儲存到檔案等... } }相關推薦
使用SDK對FBX模型的載入與讀取
一.初始化FBX SDK FbxManager* pManager = NULL; FbxScene* pScene = NULL; pManager = FbxManager::Create();
基於FBX SDK的FBX模型解析與載入 -(三)
6. 載入Camera和Light 在FBX模型中除了幾何資料外較為常用的資訊可能就是Camera和Light,雖然在遊戲中一般不直接從模型中得到這兩部分資訊,而是由引擎來提供,但是FBX中提供了對這些資訊儲存的支援。其實單純載入這兩部分的資訊很簡單,就像之前介紹的在整
基於FBX SDK的FBX模型解析與載入 -(二)
5. 載入材質 Material是一個模型渲染時必不可少的部分,當然,這些資訊也被存到了FBX之中(甚至各種貼圖等也可以直接內嵌到FBX內部),就需要從FBX中載入這些資訊以完成帶有材質的渲染。材質的載入可以與Mesh的載入相結合來完成,但更好的方法是獨立進行,這樣各模組
基於FBX SDK的FBX模型解析與載入
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