zoukankan      html  css  js  c++  java
  • 一、Blender/Python 快速入门

    原文:https://docs.blender.org/api/blender_python_api_current/info_quickstart.html#native-types


    1 前言

      可以做的:

        ~可以编辑所有数据

        ~可以修改用户设置,快捷键和主题

        ~可以使用自己定义的工具

        ~可以创建用户接口,例如,菜单,标题,面板

        ~。。。

      不可以做的:

        ~创建新的空间类型

        ~

    2 开始之前

      运行脚本

        1、使用内建的文本编辑器

        2、使用Pyhton控制台

        这两者都是区域的一种类型,都可以在标题栏中进行切换

    3 关键概念

      3.1 使用数据

        使用数据块

            Python使用数据的方式与动画系统与用户界面使用数据的方式一样,也就是说你可以通过按钮更改的设置,同时也可以使用Python来更改。

          使用bpy.data模块来操作当前打开的blend文件。

        关于集合

            您会注意到,索引和字符串都可以用来访问集合的成员。

    >>> bpy.data.objects['Cube']
    bpy.data.objects["Cube"]
    >>> bpy.data.objects[0]
    bpy.data.objects["Cube"]

        获取属性

            当获取一个数据块后,就可以通过访问它的属性来进行操作,就像在图形界面中一样。事实上,每个工具提示框中都显示了你在Python中如何访问到这个属性

          可以使用“控制台”来测试你要访问哪些数据,这是它自己的空间类型。这个支持自动完成,给你一个快速的方法,在你的文件中挖掘不同的数据。

        新建数据和移除

            新的数据块不能通过调用它的类来创建,这对熟悉其他Python API的人来说或许有些诧异。这在API设计中是有意义的,Blender/Python API不能

          在主要的Blender数据库之外创建Blender数据(通过bpy.data访问),因为这个数据是由Blender(save /load/undo/ append)管理的。等等)。通过

          bpy. Data中的集合的方法来添加和删除数据。

    >>> mesh = bpy.data.meshes.new(name="MyMesh")
    >>> print(mesh)
    <bpy_struct, Mesh("MyMesh.001")>
    >>> bpy.data.meshes.remove(mesh)

        自定义属性

            如果数据块有自己的ID,那么Python就能访问它的属性。当指定一个新的属性时,它将被创建或是重写原来的同名属性。这些数据将会随着blend文件

          一起保存,随着对象一起被复制。

          注意:这些属性只能被指定为基础Python数据类型:

            · int, float, string

            · array of ints/floats

            · dictionary (only string keys are supported, values must be basic types too)

          这些属性在Python之外是有效的。它们可以通过曲线或在驱动路径中使用。

      3.2 上下文

          虽然直接通过名称或列表访问数据非常有用,但在用户的选择上进行具体操作更为常见。上下文始终可以从bpy获得。上下文,可用于获取活动对象、

        场景、工具设置以及其他许多属性。

          注意,上下文是只读的。这些值不能直接修改,尽管它们可以通过运行API函数或使用bpy.data API来改变。

          上下文属性根据被访问的位置而变化。3D视图的上下文成员与控制台不同,因此在访问用户状态所知道的上下文属性时要小心。

          参见bpy.context

      3.3 运算符(工具)

          操作符是用户通过按钮、菜单项或快捷键访问的工具。从用户的角度来看,它们是一个工具,但Python可以通过  bpy.ops  模块来运行这些设置。

        poll()

          通过提前调用poll(),可以避免使用try/catch语句,从而可以检查是否在合适的上下文中执行ops操作

    4 结合

      Python脚本可以通过下面的方式来与Blender结合:

        · 定义一个渲染引擎

        · 定义一系列操作

        · 定义菜单,标题栏和面板

        · 向已有的菜单,标题栏和面板中插入新的按钮

      这可以通过定义一个已经存在类型的子类来完成。

      4.1 自定义运算操作脚本

    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()

      4.2 面板例

         bpy.types.Panel

        注意,额外的bl_变量用于设置它们所显示的上下文。

    import bpy
    
    
    class 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()

    5 类型

      5.1 原生类型   

        1)Blender float/int/boolean -> float/int/boolean

        2)Blender enumerator -> string

          >>> C.object.rotation_mode 'AXIS_ANGLE'

        3)Blender enumerator (multiple) -> set of strings

          # setting multiple camera overlay guides

          bpy.context.scene.camera.data.show_guide {'GOLDEN''CENTER'}

          # passing as an operator argument for report types

          self.report({'WARNING''INFO'}, "Some message!")

      5.2 内部类型

          bpy.types.bpy_struct

          数据包含自己的属性组/网格/骨头/场景……等等

      5.3 Mathutils类型(数学工具)

          用于矢量,四元数,欧拉,矩阵和颜色类型  mathutils

    6 动画

        在Python中有两种方法来添加关键帧,一种是直接通过key属性来添加,就像通过界面中按钮添加一样。还可以手动创建曲线和关键帧数据,

      然后设置该属性的路径。

    #Simple example:
    
    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)

     #Using Low-Level Functions:

    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
  • 相关阅读:
    JAVA 综合面试题
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/wildbloom/p/7730210.html
Copyright © 2011-2022 走看看