1. 程式人生 > >FBX 解析 材質與貼圖

FBX 解析 材質與貼圖

   本文采用 AUTODESK的FBX SDK來解析fbx檔案,使用語言為python。

   下面結合程式碼解析出fbx檔案中的材質與貼圖,以及簡單介紹涉及到的類的關係。

1.sdk中的一些基本概念

   FbxScene    該類包含了整個3D場景的描述。對檔案進行解析時,要先獲得場景物件,然後在解析該物件裡的內容。    FbxObject    大多數FBX物件的基類。物件之間通過connections進行連線。通過連線,物件間相互關聯以形成層次結構或結構。即fbx的場景中物件的關係都表示為物件的連線。    FbxObject提供了Property(屬性)這種機制來描述場景中物件的特徵。    FbxProperty

   用來儲存屬性的類    ClassID    用於在執行時區分物件的內部類。每個類都有唯一的ClassId

2.解析fbx檔案

   下面是本次解析內容(mesh的名字,材質名稱,貼圖名稱,材質貼圖引用關係)的的關係結構圖: 在這裡插入圖片描述

1)載入scene

lSdkManager,lScene = InitializeSdkObjects()
LoadScene(lSdkManager,lScene,"xxx.FBX")

2)獲取節點node以及名字    scene中包含了所有node中的root節點。

rootNode = pScene.GetRootNode()

   node之間通過樹狀結構連線,通過 GetChild() 與遞迴即可獲得所有node

if rootNode:
for i inrange(rootNode.GetChildCount()):
	ChildNode = rootNode.GetChild(i)
	if ChildNode:
		AllNodes.append(ChildNode)
		FindChildNodes(AllNodes,ChildNode)

   獲取node名字

lNode.GetName()

3)獲取材質Material以及名字    獲取材質

NodeMaterial = lNode.GetMaterial(0)

   獲取材質名字

NodeMaterial.GetName()

4)獲取貼圖Texture以及檔案路徑

   貼圖可以直接從scene中獲得

tex_num = lScene.GetTextureCount()
#print(tex_num)
for i inrange(tex_num):
	tex = lScene.GetTexture(i)

   貼圖檔案路徑

path = tex.GetFileName()

5)獲取材質,貼圖關係    根據材質擁有的屬性去獲取相應的關係

#DiffuseTextures
lProperty = pMaterial.FindProperty(FbxSurfaceMaterial.sDiffuse)

#BumpTextures
lProperty = pMaterial.FindProperty(FbxSurfaceMaterial.sBump)

   可以通過關係去獲取相應材質

num_textures = pProperty.GetSrcObjectCount(FbxCriteria.ObjectType(FbxTexture.ClassId))
texture = pProperty.GetSrcObject(FbxCriteria.ObjectType(FbxTexture.ClassId),i)