Chinaunix首页 | 论坛 | 博客
  • 博客访问: 915276
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: Python/Ruby

2011-07-01 21:47:26

首先,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) |
给主人留下些什么吧!~~