BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4284|回复: 5

blender python开始

[复制链接]
发表于 2011-7-2 14:37:49 | 显示全部楼层 |阅读模式
可以参考这个英文网站:
http://www.blender.org/documentation/blender_python_api_2_66_release/
[nirenyang代编辑,因为之前的链接过期了,以后大家改api数字就ok]

首先,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字符、单行。
发表于 2011-7-3 16:54:23 | 显示全部楼层
学习了~
回复 支持 反对

使用道具 举报

发表于 2011-7-15 10:32:01 | 显示全部楼层
当我看到blenderplayer的意义时我就想到了RGSPlayer(Ruby Game System/script player RPGMAKER的引擎)
回复 支持 反对

使用道具 举报

发表于 2011-8-13 10:37:07 | 显示全部楼层
LZ学习很用心,而且为大家铺路了,谢谢了
回复 支持 反对

使用道具 举报

发表于 2012-6-13 19:44:07 | 显示全部楼层
技术贴,狂顶
回复 支持 反对

使用道具 举报

发表于 2013-4-5 11:44:54 | 显示全部楼层
最近写东西,又从搜索引擎爬到这了。

内容很实用,整理归纳得很棒!感谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-11-13 06:20 , Processed in 0.017928 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表