首先,python能在blender中做什么?
1. 编辑任何能用界面编辑的数据(场景, 网格物体, 粒子等)
2. 修改用户的偏好设置, 键盘映射及 主题
3. 执行工具
4. 创建用户自己的元素如:菜单, 标题, 面板
5. 创建新的工具
6. 创建交互工具
7. 创建新的能集成到Blender的渲染工具
8. 针对Blender数据定义新的设定。
9. 在3D视图中画图。
当然Blender不能做下面的事:
1.创建新的空间类型
2.给任何类型赋自定义的属性
3.当Python定义的属性被改变时,回调。
在开始前需要知道下面这些东西。
1. Blender对应的Python版本是3.2(2.58版本,以前是3.1), 一些第三方的扩展现在还不能用。
2. Blender中的交互Console还不错, 可以测试一行的代码
3. 要是想看具体的问题,就参考一下2.58中Python的API参考吧。
4. 按钮的提示会显示Python属性与操作符的名称。
5. 右键任何一个按钮或是菜单,都能直接跳到API文档。
6. text菜单有一个模板节,那里有很多示例。
7. 可以参考 ./blenders/script/ui and ./blender/scripts/op来看UI与操作的定义。
重要概念:
1.Data Access
Python访问Blender的数据都是按下面的方式,这个是与动画或是UI是一致的,或者说Blender本身就用下面的方式管理数据。
用模块
bpy.data
>>> bpy.data.objects
<bpy_collection[6], BlendDataObjects>
>> bpy.data.scenes
<bpy_collection[1], BlendDataScenes>
>>> bpy.data.materials
<bpy_collection[1], BlendDataMaterials>
|
关于 集合
每个物体都可以通过名字来对bpy.data.objects[]集合进行访问。
>>> list(bpy.data.objects)
[bpy.data.objects["Cube"], bpy.data.objects["Plane"]]
>>> bpy.data.objects['Cube']
bpy.data.objects["Cube"]
>>> bpy.data.objects[0]
bpy.data.objects["Cube"]
|
下面可以访问数据的属性。
>>> bpy.data.objects[0].name
"Cube"
>>> bpy.data.scenes["Scene"]
<bpy_struct Scene("Scene")>
>>> bpy.data.materials.new("MyMaterial")
<bpy_struct Material("MyMaterial")>
|
另外还有一个自动完成的功能, 可以在console中使用。
另外,如果你熟悉python就应该知道,我们是可以对任何一个对象赋自己定义的属性的。
不过这种属性由于要写到blender文件中,
只能是基本类型:
int, float, string
int, float的数组
或者说key是string类型的字典
上下文
我们要操作数据,除了按上面的方式,还可以通过context来访问数据
>>> bpy.context.object
>>> bpy.context.selected_objects
>>> bpy.context.visible_bones
|
上面就分别得到相应的对象,不过要赢利context得到的数据都是只读的。
操作符:
这个就是用户通过按钮,菜单, 或者快捷键调用到的。对于用户这就是一个工具,对于python就是一个可以调用的操作。
>>> bpy.ops.mesh.flip_normals()
{'FINISHED'}
>>> bpy.ops.mesh.hide(unselected=False)
{'FINISHED'}
>>> bpy.ops.object.scale_apply()
{'FINISHED'}
|
上面就分别调用了三种操作。
有些操作符是有一个函数叫poll(),它可以用来检查视图或是物体是否在正确的状态。
集成到blender中
如果我们想集成一个脚本到blender中,我们可以定义下面的东西:
1.一个渲染引擎
2.一个操作符
3.菜单, 标题或是面板。
4,在现有的菜单,标题或是面板中加入一个按钮。
import bpy
class OpHelloWorld(bpy.types.Operator):
bl_idname = "screen.hello_world"
bl_label = "Hello World"
def execute(self, context):
self.report({'WARNING'}, "Hello World")
return {'FINISHED'}
# registering and menu integration
def register():
bpy.utils.register_class(OpHelloWorld)
# unregistering and removing menus
def unregister():
bpy.utils.unregister_class(OpHelloWorld)
if __name__ == "__main__":
register()
|
上面的代码就注册了一个操作符。
import bpy
class OBJECT_PT_hello(bpy.types.Panel):
bl_label = "Hello World Panel"
bl_space_type = "PROPERTIES"
bl_region_type = "WINDOW"
bl_context = "object"
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row()
row.label(text="Hello world!", icon='WORLD_DATA')
row = layout.row()
row.label(text="Active object is: " + obj.name)
row = layout.row()
row.prop(obj, "name")
# registering and menu integration
def register():
bpy.utils.register_class(OBJECT_PT_hello)
# unregistering and removing menus
def unregister():
bpy.utils.unregister_class(OBJECT_PT_hello)
if __name__ == "__main__":
register()
|
上面的代码就定义了一个自定义的面板。
类型
blender定义了一系列自己的类型,
1.blender float、int,boolean对应python的float,int,boolean
2.blender枚举对应string或是一个string的集合。
数学类型
有些数据是可以直接用数据操作符进行操作的。
如:
location, rotation——euler, cursor—location等是可以直接用数学类型访问的。
动画:
blender可能通过python代码来通过修改物体属性与插入关键帧来做动画。
一种是直接操作关键帧
obj = bpy.context.object
obj.location[2] = 0.0
obj.keyframe_insert(data_path="location", frame=10.0, index=2)
obj.location[2] = 1.0
obj.keyframe_insert(data_path="location", frame=20.0, index=2)
|
一种是直接操作动画action
obj = bpy.context.object
obj.animation_data_create()
obj.animation_data.action = bpy.data.actions.new(name="MyAction")
fcu_z = obj.animation_data.action.fcurves.new(data_path="location", index=2)
fcu_z.keyframe_points.add(2)
fcu_z.keyframe_points[0].co = 10.0, 0.0
fcu_z.keyframe_points[1].co = 20.0, 1.0
|
善于代码的风格:
1.骆驼命名类:MyClass
2.小写字符用下划线分隔做模块名 my_module
3.四个空格缩进,不用tab
4.操作符用空格分隔
5.不用单行复合代码。
6.单引号用于enum, 双引号用于字符串。
7.是好不操作79字符、单行。
阅读(6845) | 评论(0) | 转发(0) |