跳轉到內容

Blender 3D:菜鳥到專業/高階教程/Python 指令碼/匯入指令碼

來自 Wikibooks,開放世界中的開放書籍

將物件匯入 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 視窗,以確保新物件最初是可見的。如果我們沒有這樣做,物件可能不會出現,直到使用者改變視點或以其他方式強制重新繪製。

華夏公益教科書