2018年6月11日 星期一

初探Blender的script

初探Blender的script

前言

  遊戲引擎在最初的實作都是直接輸入頂點的資訊來達成的,但這可不是長久之計,如果所需要的模型較為複雜,通常採用能儲存3D模型的檔案格式(如OBJ、FBX...等),然後在製作相對應的parser在引擎端來完成模型匯入,但目前這些檔案格式都多少有一些缺陷,普遍的缺陷是無法記錄多個動畫,而FBX雖然可以支援多個動畫,但該格式常有前後版本不相容的麻煩,所以就想要自己匯出資料,而手邊沒有常見的3dsMAX與Maya,只有Blender,所以就來研究Blender的script。

內容

  在Blender要使用script時,請先開啟輸出的console,這樣可以方便看script輸出的結果,可以方式如下圖
開啟輸出的console

接著開啟Text Editor輸入程式碼後,再按下"Run Script"來執行script,如下圖
執行script
有一點要注意,這個Text Editor在要輸入時,滑鼠座標必須要在該視窗上!和一般點擊後focus該視窗的使用習慣不同。
  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 Contents
triangulate mesh in python

沒有留言:

張貼留言