Blender 3D:菜鳥到專業/高階教程/Python 指令碼/匯入指令碼
外觀
< Blender 3D:菜鳥到專業 | 高階教程
|
|
適用的 Blender 版本:2.49。 |
將物件匯入 Blender 與匯出並沒有太大區別。但是,有一些額外的注意事項需要處理。首先,標題中所有關於“匯出”的引用都應該更改為“匯入”。其次,我們不是簡單地輸出 Blender 提供給我們的資料,而是負責向 Blender 提供資料並確保其格式正確。儘管 Blender 非常靈活,允許我們忽略頂點索引等資訊,但我們確實需要小心,確保以合理的方式進行操作。
此外,還需要進行一些整理工作。我們在修改網格資料時應該處於編輯模式。我們還需要將新建立的資料連線到場景,在它被正確構建之後,這樣 Blender 才能看到它並維護它。這使其對使用者可見,並確保它與場景一起儲存。
這是一個簡單的指令碼,可以匯入由 匯出指令碼 建立的 OBJ 檔案。
import Blender
def import_obj(path):
Blender.Window.WaitCursor(1)
name = path.split('\\')[-1].split('/')[-1]
mesh = Blender.NMesh.New( name ) # create a new mesh
# parse the file
file = open(path, 'r')
for line in file:
words = line.split()
if len(words) == 0 or words[0].startswith('#'):
pass
elif words[0] == 'v':
x, y, z = float(words[1]), float(words[2]), float(words[3])
mesh.verts.append(Blender.NMesh.Vert(x, y, z))
elif words[0] == 'f':
faceVertList = []
for faceIdx in words[1:]:
faceVert = mesh.verts[int(faceIdx)-1]
faceVertList.append(faceVert)
newFace = Blender.NMesh.Face(faceVertList)
mesh.addFace(newFace)
# link the mesh to a new object
ob = Blender.Object.New('Mesh', name) # Mesh must be spelled just this--it is a specific type
ob.link(mesh) # tell the object to use the mesh we just made
scn = Blender.Scene.GetCurrent()
for o in scn.getChildren():
o.sel = 0
scn.link(ob) # link the object to the current scene
ob.sel= 1
ob.Layers = scn.Layers
Blender.Window.WaitCursor(0)
Blender.Window.RedrawAll()
Blender.Window.FileSelector(import_obj, 'Import')
這將把 OBJ 檔案載入到 Blender 中,建立一個新的網格物件。讓我們看一下更有趣的部分。
Blender.Window.WaitCursor(1)
開啟等待游標,以便使用者知道計算機正在匯入。
name = path.split('\\')[-1].split('/')[-1]
mesh = Blender.NMesh.New( name ) # create a new mesh
在這裡,我們建立了一個新的網格資料塊。名稱由路徑和檔名組成。
ob = Blender.Object.New('Mesh', name)
ob.link(mesh)
接下來,我們建立一個新物件並將其連結到網格。這將例項化網格。
scn = Blender.Scene.GetCurrent() scn.link(ob) # link the object to the current scene ob.sel= 1 ob.Layers = scn.Layers
最後,我們將新物件附加到當前場景,使其對使用者可用,並確保它與場景一起儲存。我們還會選擇新物件,以便使用者在匯入後可以輕鬆修改它。複製場景層可以確保物件位於場景的當前檢視層中。
Blender.Window.WaitCursor(0) Blender.Window.RedrawAll()
現在是最後的潤色。我們關閉等待游標。我們還重新繪製 3D 視窗,以確保新物件最初是可見的。如果我們沒有這樣做,物件可能不會出現,直到使用者改變視點或以其他方式強制重新繪製。