初探Blender的script
前言
遊戲引擎在最初的實作都是直接輸入頂點的資訊來達成的,但這可不是長久之計,如果所需要的模型較為複雜,通常採用能儲存3D模型的檔案格式(如OBJ、FBX...等),然後在製作相對應的parser在引擎端來完成模型匯入,但目前這些檔案格式都多少有一些缺陷,普遍的缺陷是無法記錄多個動畫,而FBX雖然可以支援多個動畫,但該格式常有前後版本不相容的麻煩,所以就想要自己匯出資料,而手邊沒有常見的3dsMAX與Maya,只有Blender,所以就來研究Blender的script。內容
在Blender要使用script時,請先開啟輸出的console,這樣可以方便看script輸出的結果,可以方式如下圖開啟輸出的console |
接著開啟Text Editor輸入程式碼後,再按下"Run Script"來執行script,如下圖
執行script |
script的程式語言是Python,如果要查詢class的說明的話可以到Blender Documentation Contents,接著執行以下的程式碼
import bpy import os import bmesh os.system("cls") tagMesh = bpy.data.meshes["Cube"] for i in range( len(tagMesh.vertices) ): print(tagMesh.vertices[i].co)
程式碼裡的bpy.data.mesh["Cube"],指的是要拿取哪一個Mesh的資料,請依據狀況修改。執行後可以在console裡得到該Mesh所有vertex的位址。看起來很簡單對吧!但是Index buffer的資料就沒這麼簡單了,如果你查詢該型別的資料,可能會認為這個資訊可能會儲存於"tagMesh.polygons",雖然可查到哪幾個Index可以形成polygon,但卻不知道triangle的index順序,如果沒有這個順序就沒辦法順利產生Index buffer的資料,所以請用以下的程式碼
import os import bmesh os.system("cls") tagMesh = bpy.data.meshes["Cube"] tagBMesh = bmesh.new() tagBMesh.from_mesh(tagMesh) bmesh.ops.triangulate(tagBMesh, faces=tagBMesh.faces[:], quad_method=0, ngon_method=0) for face in tagBMesh.faces: for i in range(len(face.loops) ): print(face.loops[i].vert.index," ",end="") print("\n") tagBMesh.free()
可以看到要先把Mesh轉成BMesh,轉完後,在經過triangulate()後,會將所有的polygon輸出成triangle,再從tagBMesh.faces裡取得每個triangle的index,並注意取得的triangle順序是"逆時針"。
後記
本篇只有基本的取得vertex與index的資料,這些資料顯然是不夠的,其他像是如何寫檔與將script寫成addon,又或是取的其它的vertex資訊就日後再研究了。參考內容
Blender Documentation Contentstriangulate mesh in python
沒有留言:
張貼留言