Blender 3D:菜鸟到专业/Python 平台跳跃:创建
适用 Blender 版本:2.49。 |
注意:Python 代码放置在文本编辑器窗口中。将您的 3D 视图窗口分成独立的部分可能会有所帮助,以便您可以同时使用按钮、3D 视图和文本编辑器窗口。
Python 平台跳跃教程系列的初始阶段主要与复制逻辑板平台跳跃教程中所做的事情有关。如果您没有阅读和理解这些教程,您可能不理解大多数代码的功能。本教程详细介绍
- 对要修改、重写或重新定义的“代码部分”的解释,将在整个系列中频繁出现
- 创建与预制网格关联的对象
- 将对象链接到场景
并将详细说明完成情况
- 如何响应键盘触发来移动对象
在整个系列中,我们将以这种方式引用代码部分
代码开头的一系列导入命令,就像 HTML 文档中 head 标签的内容一样。Python 有一些基本命令自然保存在语言中,其他命令则被导入,这样就不会在不需要的时候加载大量命令,从而导致不必要的内存开销。这带来了能够通过编写自定义命令集来扩展语言的优势,这些命令集可以导入到 Python 中,这就是 Blender 如何与 Python 交互的方式。对于本教程,我们的导入部分是
import Blender
import bpy
当您以其他名称导入某物时,它基本上会创建一个等于导入模块名称的变量,这样您就不必将其全部键入。这是不必要的,但它可以使编码更快。您可能想要在您的文档上运行查找和替换搜索,将您导入的所有实例的名称替换为实际模块的名称,并删除以其他名称导入模块的部分,因为这可以让代码运行得稍快一些。
这是您必须记住在文档末尾包含的命令集合,无论对代码进行了任何更改,它才能正常工作。必须注意您应该更改整个页脚(就像从主代码中删除了某个功能一样),或者在您现有的页脚中添加一个命令(如果文本涉及单个功能的添加)。主教程行中的每一篇文章都应该包含完整的页脚,因为它应该在该系列中的该点显示。在本教程中,我们的基本页脚是
Blender.Redraw()
首先,创建一个新文档并删除基本立方体。创建一个猴子/Suzanne。在选择猴子的编辑面板中,将网格名称(ME:)更改为“Hero”,位于“链接和材质”下。单击输入框旁边的 F 以保留数据块,即使没有链接到它。现在删除猴子对象。
以下代码将在库中创建一个名为“Player”的对象,并将其链接到“Hero”网格。
player = Blender.Object.New("Mesh","Player")
player.link(bpy.data.meshes["Hero"])
在第一行中,Blender.Object.New 显然引用了一个新对象。对于本代码的目的,不应该更改“Mesh”变量。我不知道它的确切功能,所以我不希望给出错误的信息,但我推测它与对象类型有关。例如,如果该对象是灯或相机类型,则无法将网格应用于它。第二个变量“Player”是您正在创建的实际对象的名称。随意更改它。
在第二行中,我们将 player(它等于我们的新对象)链接到预先存在的网格“Hero”,它是我们之前处理过的 Suzanne 网格。使用这种方法,您可以事先对角色的网格进行建模,但让实际角色动态创建。通过使用此代码的复杂化,您可以使 player.link() 链接到一个变量,而不是链接到“bpy.data.meshes[]”。该变量可以引用现有网格,也可以创建一个新网格。至于链接值的意思,bpy.data.meshes 是一个包含电影中所有网格的数组。同样,bpy.data.objects 包含电影中的所有对象。通过转到脚本窗口并转到脚本->系统->交互式控制台,您可以获得诸如这些数组的内容之类的信息。通过在控制台中输入“list(bpy.data.objects)”,您将获得一个格式为 [[Object "Camera"], [Object "Cube"], [Object "Lamp"]] 的列表,它是标准新文档设置中的对象列表。因此,要引用项目 [Object "Cube"],您将使用“bpy.data.objects['Cube']”行,依此类推。为了使这些命令起作用,您必须确保在导入部分中导入 bpy。
就像您必须将网格追加到对象一样,您还必须将对象追加到场景,否则它只是一个浮动的数据库块,实际上不会出现在任何地方。
scene = Blender.Scene.GetCurrent()
scene.link(player)
如果您要通过在鼠标悬停在文本编辑器窗口上时按ALT-P来测试此代码,它将在场景的原点处创建一个名为 Player 的对象,该对象具有猴子“Hero”网格。确保您在所有其他代码之前包含了本教程的导入部分,以及所有其他代码之后的必要页脚。
版本 2.7
import bpy
myMesh = bpy.data.meshes["Hero"] # reference existing mesh
player = bpy.data.objects.new("Mesh", myMesh) # create new object
player.name = "Player" # give it a name
bpy.context.scene.objects.link(player) # link to the scene to show