文档章节

Blender的插件开发-对象体系探索

openthings
 openthings
发布于 2015/01/27 09:23
字数 995
阅读 943
收藏 2

按照python的说法一切皆对象,Blender中亦然。

Blender的根对象是bpy,因此任何模块都需要:

import bpy

注意:

        Blender的脚本print("hello")函数是输出信息到启动的控制台的,直接运行的时候看不到输出的信息。

        可以扩展出一个窗口,选择“信息”,就可以把当前所有操作的命令和执行结果都显示在其中,非常方便。

bpy.data

然后,任何对象其实都是数据,因此访问blender的第一个关键对象是bpy.data。现在,我们打开python的命令行窗口:

拖动3D视图的右上角,向左下,扩展出一个窗口。
选择左下角的立方体,选择Python控制台,然后就可以输入Python脚本了。

在其中输入:

>>bpy.data.objects
<bpy_collection[4], BlendDataObjects>

    bpy_collection是一个python的词典对象,显示有四个对象(窗口初始是三个对象,我加了一个)。

    想知道是哪几个对象?很好办。用一个遍历,如下所示,列出了所有对象的名字:

>>> for obj in bpy.data.objects:
...     print(obj.name)
...     
Camera
Cube
Lamp
融球

    通过这种方式,我们可以操作Blender的几乎所有数据。

bpy.context

    bpy.context顾名思义就是运行的上下文环境,这个在脚本环境里到处碰到了。知道了这个,呵呵!

>>> bpy.context.object
>>> bpy.context.selected_objects
>>> bpy.context.visible_bones

    这里可以看到,context也可以访问到object,这个是当前的环境可用的对象,其数据跟data里是一致的。后面的ops还可以来访问和修改对象的属性值。

    这是典型的python式的“面向对象”,数据按照对象来组织,但是访问时却是以函数方式出现的,从而适应脚本环境的运行需要。

bpy.ops

    bpy.ops是Operator(操作器)的简写,封装了很多的对象操作在里面,是Blender功能的核心了。

>>> bpy.ops.mesh.flip_normals()
{'FINISHED'}

>>> bpy.ops.mesh.hide(unselected=False)
{'FINISHED'}

>>> bpy.ops.object.scale_apply()
{'FINISHED'}

    一个操作器的完整例子:

import bpy

def main(context):
    for ob in context.scene.objects:
        print(ob)

class SimpleOperator(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.simple_operator"
    bl_label = "Simple Object Operator"

    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        main(context)
        return {'FINISHED'}

def register():
    bpy.utils.register_class(SimpleOperator)

def unregister():
    bpy.utils.unregister_class(SimpleOperator)

if __name__ == "__main__":
    register()

    # test call
    bpy.ops.object.simple_operator()

     注意里面的register/unregister,以及其中的class和poll、execute成员函数,这是一个典型的插件的实现结构。

    大部分插件照着上面这个结构依瓢画葫芦就可以了。

bpy.types

    bpy.types不是python的type对象的简单封装,而是Blender各种“类”的集合,不要问我到底有啥区别哈,谁用谁知道啊。

   注意:Panel也是types里面的东东啊。下面是定义Panel的插件:

import bpyclass HelloWorldPanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    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")

        row = layout.row()
        row.operator("mesh.primitive_cube_add")

def register():
    bpy.utils.register_class(HelloWorldPanel)

def unregister():
    bpy.utils.unregister_class(HelloWorldPanel)

if __name__ == "__main__":
    register()

    注意,这里多了一些变量的声明,这是插件的一些说明。

bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"

    所有插件原则上都应该包含上面这些信息,引号内的字符串可以修改,变量名不能修改(否则就成自己的了)。这个插件信息声明了这个panel是在对象的属性面板中出现。

    bpy.types包含的一些对象如下:

bpy.types.Panel
bpy.types.Menu
bpy.types.Operator
bpy.types.PropertyGroup
bpy.types.KeyingSet
bpy.types.RenderEngine

    这里再次了出现Operator对象,跟前面的bpy.ops是不是一样的啊?

    我猜测应该是,考虑到type是python的基本对象,这个现象一点也不奇怪。要想一探究竟,很简单,到python控制台运行一下即可。



© 著作权归作者所有

openthings
粉丝 313
博文 1118
码字总数 644835
作品 1
东城
架构师
私信 提问
加载中

评论(3)

d
dev3d
写得很好,厉害!
openthings
openthings 博主

引用来自“921977939qqcom”的评论

你太装逼了,文档地址都不给就叫我们用,怎么学完全?80
这篇是教人用脑子的,不是依葫芦画瓢。要学全还早着呢!详细的要到blender.org去查的,开源软件是会不断更新的。
921977939qqcom
921977939qqcom
你太装逼了,文档地址都不给就叫我们用,怎么学完全?80
Blender的插件开发-快速入门

使用Blender创建精彩非凡的作品,你可以是三维图形、创意设计的专家,但不必要成为软件开发的专家。 Blender具有强大的插件扩展功能,不仅可以加载大量的各种功能、效率增强插件,而且稍微懂...

openthings
2015/01/27
0
5
Sublime Text 3作为Blender的开发编辑器

Blender是一个开放的三维建模软件,支持python脚本扩展。而Sublime具有优秀的代码编辑功能,这二者的结合犹如干将莫邪,这里做一个简单的介绍。这里所做的是通过socket将Blender和Sublime连接...

openthings
2015/01/28
0
0
将ogre的模型导入到blender中, 导出为fbx,并导入到 unity 中

ogre 的作为开源界最好的图像渲染引擎,被很多游戏使用,比较有名的一款arpg 火炬之光,使用的就是ogre。 围绕ogre有很多第三方开发的插件,其中比较著名的有一个 粒子系统,还有一个叫做CEG...

李勇2
2015/02/28
0
0
Blender的插件开发-Operator操作器(算子)

毫无疑问,Operator是Blender中最为核心的一个对象,而且里面包罗万象(不仅可以操作几何对象,所有的菜单都可以控制,因为Blender其实就是一个三维图形的超级命令解释器嘛!)。 我们先定义...

openthings
2015/01/28
0
0
Verge3D 2.8 for Blender 发布,WebGL 应用构建框架

Verge3D 2.8 for blender 这个Verge3D版本适用于Blender和3ds Max。版本2.8带来了拼图编辑器的重大改进,WordPress插件的更新,对自定义拆分节点的支持以及几个新的Cycles节点和升级的代码示...

yuri_s8s
2018/10/10
634
0

没有更多内容

加载失败,请刷新页面

加载更多

北斗三号IGSO-2卫星发射成功!

6月25日,中国航天科技集团官方公众号宣布,北斗三号IGSO-2卫星发射成功! 航天科技集团表示,6月25日2点09分,我国在西昌卫星发射中心用长征三号乙运载火箭成功将北斗三号第2颗倾斜地球同步...

linuxCool
7分钟前
0
0
阿里java开发规约的Idea插件安装(英文)

Idea Plugin Prepare Project JDK: 1.7+ Gradle: 3.0+(Require JDK1.8+ for gradle) Build cd p3c-ideagradle clean buildPlugin Run plugin cd p3c-ideagradle runIde# run speci......

Airship
17分钟前
0
0
很多人转行做程序员选择web前端学习,前端简单在哪里?

不管你是工人阶层还是服务行业,是否想过转行IT,转行IT后肯定会选择一门编程语言进行深入学习,很多转行的人基础都不是太好,不是科班出身,甚至有的是专科乃至中专,前端的HTML和CSS相对其...

智云编程
30分钟前
0
0
一文读懂内网、公网和NAT

我们做弱电监控系统的时候,都避免不了要跟IP地址打交道,比如摄像头、NVR、服务器等这些设备安装好之后,就需要给它们配上IP,那这个IP地址你了解嘛?今天我们就一起来聊聊什么是内网、公网和...

老孟的Linux私房菜
34分钟前
4
0
聊聊dubbo的ExecuteLimitFilter

序 本文主要研究一下dubbo的ExecuteLimitFilter ExecuteLimitFilter dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java public clas......

go4it
43分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部