跳转到内容

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 窗口,以确保新对象最初是可见的。如果我们没有这样做,对象可能不会出现,直到用户改变视点或以其他方式强制重新绘制。

华夏公益教科书