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