ホームページ  >  記事  >  バックエンド開発  >  Blender Pythonプログラミング導入事例分析

Blender Pythonプログラミング導入事例分析

王林
王林転載
2023-05-12 10:55:051770ブラウズ

    Blender Python プログラミング

    サポートされる機能:

    • ユーザー インターフェイスの編集はい編集任意のデータ(シーン、メッシュ、パーティクルなど)。

    • ユーザー設定、キーマップ、テーマを変更します。

    • 独自の設定でツールを実行します。

    • メニュー、ヘッダー、パネルなどのユーザー インターフェイス要素を作成します。

    • 新しいツールを作成します。

    • 対話型ツールを作成します。

    • Blender と統合された新しいレンダリング エンジンを作成します。

    • データとそのプロパティへの変更をサブスクライブします。

    • 既存の Blender データ内で新しい設定を定義します。

    • Python を使用して 3D ビューを描画します。

    (まだ) 不足している機能:

    • 新しいスペース タイプを作成します。

    • #カスタム プロパティを各タイプに割り当てます。

    データ アクセス

    Python は、アニメーション システムやユーザー インターフェイスと同じ方法で Blender のデータにアクセスします。つまり、ボタンで変更できる設定は Python からも変更できるということです。

    現在ロードされている Blender ファイルからデータにアクセスするには、モジュール

    bpy.data を使用します。これにより、ライブラリ データへのアクセスが可能になります。例:

    >>> bpy.data.objects
    <bpy_collection[3], BlendDataObjects>
    >>> bpy.data.scenes
    <bpy_collection[1], BlendDataScenes>
    >>> bpy.data.materials
    <bpy_collection[1], BlendDataMaterials>

    コレクションへのアクセス

    インデックスと文字列の両方を使用してコレクションのメンバーにアクセスできることがわかります。 Python 辞書とは異なり、どちらの方法も使用できますが、Blender の実行時にメンバーのインデックスが変更される可能性があります。

    list(bpy.data.objects)
    [bpy.data.objects["Cube"], bpy.data.objects["Plane"]]
    >>> bpy.data.objects[&#39;Cube&#39;]
    bpy.data.objects["Cube"]
    >>> bpy.data.objects[0]
    bpy.data.objects["Cube"]

    プロパティへのアクセス

    マテリアル、オブジェクト、コレクションなどのデータ ブロックを取得したら、グラフィカル インターフェイスを使用して設定を変更するのと同じように、そのプロパティにアクセスできます。実際、各ボタンのツールチップには Python プロパティも表示され、スクリプト内でどの設定が変更されたかを見つけるのに役立ちます。

    bpy.data.objects[0].name
    &#39;Camera&#39;
    >>> bpy.data.scenes["Scene"]
    bpy.data.scenes[&#39;Scene&#39;]
    >>> bpy.data.materials.new("MyMaterial")
    bpy.data.materials[&#39;MyMaterial&#39;]

    どのデータにアクセスするかをテストするには、独自の空間タイプである Python コンソールを使用すると便利です。これによりオートコンプリートがサポートされ、ファイル内のデータをすばやく探索できるようになります。

    コンソールからすぐに見つけられるデータ パスの例:

    bpy.data.scenes[0].render.resolution_percentage
    100
    >>> bpy.data.scenes[0].objects["Torus"].data.vertices[0].co.x
    1.0

    データの作成/削除

    他の Python API に慣れていると、次のことに驚くかもしれません。 bpy API クラスを呼び出して新しいデータ ブロックを作成することはできません:

    bpy.types.Mesh()
    Traceback (most recent call last):
      File "<blender_console>", line 1, in <module>
    TypeError: bpy_struct.__new__(type): expected a single argument

    ユーザーは、Blender データベース (

    bpy.data によってアクセスされるデータベース) の外に新しいデータを作成することはできません。 Blender 管理 (保存、ロード、元に戻す、追加など) によって作成されます。

    データの追加と削除には次のメソッドのみを使用できます:

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

    カスタム属性

    Python は

    ID を使用して任意のデータ ブロックの属性にアクセスできます。 。属性を割り当てるときに、その属性が存在しない場合は作成されます。

    これらのプロパティは Blender ファイルにも保存され、オブジェクトとともに継承またはコピーされます。

    bpy.context.object["MyOwnProperty"] = 42
    if "SomeProp" in bpy.context.object:
        print("Property found")
    # Use the get function like a Python dictionary
    # which can have a fallback value.
    value = bpy.data.scenes["Scene"].get("test_prop", "fallback value")
    # dictionaries can be assigned as long as they only use basic types.
    collection = bpy.data.collections.new("MyTestCollection")
    collection["MySettings"] = {"foo": 10, "bar": "spam", "baz": {}}
    del collection["MySettings"]

    ただし、これらのカスタム プロパティ

    の値は 基本的な Python データ型である必要があります。例:

    • int/float/string

    • int/ float Array

    • Dictionary (文字列キーのみがサポートされ、値も基本型である必要があります)

    カスタム属性は Python の外部でも有効です。カーブを介してアニメートしたり、ドライブ パスで使用したりできます。

    コンテキスト コンテキスト

    名前またはリストによってデータに直接アクセスできることは非常に便利ですが、より一般的にはユーザーの選択に基づいて行われます。このコンテキスト情報は、

    bpy.context から常に入手できます。

    一般的なケース:

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

    コンテキストは読み取り専用であることに注意してください。これらの値は直接変更できませんが、API 関数を実行するかデータ API を使用することで変更できます。 したがって、これは

    エラーを発生させます

    : bpy.context.object = objしかし、これは正常に動作します:

    bpy.context . scene.objects.active = obj

    オペレーター (ツール)

    オペレーターは通常、ユーザーがボタン、メニュー項目、またはショートカット キーからアクセスするツールです。ユーザーの観点から見ると、これらはツールですが、Python は

    bpy.ops

    モジュールを通じてこれらにアクセスし、セットアップし、実行できます。 例:

    bpy.ops.mesh.flip_normals()
    {&#39;FINISHED&#39;}
    >>> bpy.ops.mesh.hide(unselected=False)
    {&#39;FINISHED&#39;}
    >>> bpy.ops.object.transform_apply()
    {&#39;FINISHED&#39;}

    Operator Cheat Sheet には、Python 構文のすべての演算子のリストとそのデフォルト値、および生成されたドキュメントが記載されています。これは、Blender のすべてのオペレーターについて学ぶのに最適な方法です。

    Operator Poll()

    多くの Operator には独自の

    Poll()

    メソッドがあり、現在の Blender コンテキストが Operator の実行条件を満たしているかどうかを確認できます。満足できない場合、オペレーターを直接呼び出すとエラーが発生します。したがって、Operator を操作するときは、まず次の方法で コンテキストを確認することをお勧めします:

    if bpy.ops.view3d.render_border.poll():
        bpy.ops.view3d.render_border()
    Python を Blender に統合する方法

    Python スクリプト Blender との統合は、次の方法で行うことができます:

    レンダリング エンジンを定義することによって。
    • 演算子を定義することによって。
    • 通过定义菜单,标题和面板。

    • 通过将新按钮插入现有菜单,标题和面板

    在 Python 中,这是通过定义一个类来完成的,该类是现有类型的子类。

    Blender 官方文档中提供了实例的类模板。如:

    示例运算符

    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 {&#39;FINISHED&#39;}
    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()

    一旦这个脚本运行,SimpleOperator 在 Blender 中注册,可以从 Operator Search 中调用或添加到工具栏中。

    运行脚本:

    • 启动 Blender 并切换到脚本工作区。

    • 单击文本编辑器中的 New 按钮以创建新的文本数据块。

    • 从上面并将其粘贴到文本编辑器中。

    • 单击 Run Script 按钮。

    • 将光标移至 3D 视口,打开运算符搜索菜单,输入 “Simple”。

    • 点击搜索中找到的 “SimpleOperator” 项目。

    示例面板

    面板注册为一个类,就像操作符一样。请注意用于设置它们所显示的上下文的额外 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 = &#39;PROPERTIES&#39;
        bl_region_type = &#39;WINDOW&#39;
        bl_context = "object"
        def draw(self, context):
            layout = self.layout
            obj = context.object
            row = layout.row()
            row.label(text="Hello world!", icon=&#39;WORLD_DATA&#39;)
            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()

    运行脚本:

    • 启动 Blender 并切换到脚本工作区。

    • 单击文本编辑器中的 New 按钮以创建新的文本数据块。

    • 从上面并将其粘贴到文本编辑器中。

    • 单击 Run Script 按钮。

    要查看结果:

    • 选择默认立方体。

    • 点击按钮面板中的对象属性图标(最右边;出现为一个小立方体)。

    • 向下滚动查看名为 “Hello World Panel” 的面板。

    • 更改对象名称也会更新 Hello World Panel 的 name:字段。

    请注意通过代码定义的行分布以及标签和属性。

    数据类型

    Blender 定义了许多 Python 类型,但也使用 Python 本机类型。

    原生类型

    在简单的情况下,将数字或字符串作为自定义类型会很麻烦,因此可以将它们作为普通的 Python 类型进行访问。

    • Blender float / int / boolean-> float / int / boolean

    • Blender 枚举器->字符串

    >>> C.object.rotation_mode = &#39;AXIS_ANGLE&#39;
    • Blender枚举器(多个)->字符串集

    # setting multiple camera overlay guides
    bpy.context.scene.camera.data.show_guide = {&#39;GOLDEN&#39;, &#39;CENTER&#39;}
    # passing as an operator argument for report types
    self.report({&#39;WARNING&#39;, &#39;INFO&#39;}, "Some message!")

    内部类型

    用于 Blender 数据块和 Blender 集合: bpy.types.bpy_struct

    用于包含 collections/meshes/bones/scenes 等属性的数据。

    包装 Blenders 数据的主要类型有 2 种,

    • 一种用于数据块(内部称为 bpy_struct

    >>> bpy.context.object
    bpy.data.objects[&#39;Cube&#39;]
    • 另一种用于属性。

    >>> C.scene.objects
    bpy.data.scenes[&#39;Scene&#39;].objects

    Mathutils 类型

    用于表示向量,四元数,euler,矩阵和颜色类型等,可从 mathutils 模块访问它们。

    一些属性,如 bpy.types.Object.location, bpy.types.PoseBone.rotation_eulerbpy.types.Scene.Cursor_location 可以作为特殊的数学类型访问,这些类型可以一起使用并以各种有用的方式进行操作。

    例如,矩阵向量的乘法

    bpy.context.object.matrix_world @ bpy.context.object.data.verts[0].co

    注意:mathutils 类型保留对 Blender 内部数据的引用,这样更改就可以应用回来。

    举个例子

    # modifies the Z axis in place.
    bpy.context.object.location.z += 2.0
    # location variable holds a reference to the object too.
    location = bpy.context.object.location
    location *= 2.0
    # Copying the value drops the reference so the value can be passed to
    # functions and modified without unwanted side effects.
    location = bpy.context.object.location.copy()

    动画

    有两种方法可以通过 Python 添加关键帧。

    • 第一种是直接通过键属性,这类似于用户从按钮插入关键帧。

    • 您也可以手动创建曲线和关键帧数据,然后将路径设置为属性。

    这是这两种方法的示例。这两个示例都在活动对象的 Z 轴上插入关键帧。

    简单的例子:

    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)

    使用低级功能:

    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

    以上がBlender Pythonプログラミング導入事例分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。