MRが楽しい

MRやVRについて学習したことを書き残す

Blender2.8で利用可能なpythonスクリプトを作る その1(オブジェクトの作成と削除)

本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
bluebirdofoz.hatenablog.com

オブジェクトの作成

指定のメッシュオブジェクトを作成します。
オブジェクトタイプを指定すると任意のメッシュを作成することができます。
・make_object_mesh.py

# bpyインポート
import bpy

# メッシュオブジェクトの作成
# オブジェクト作成関数のマニュアル
# (https://docs.blender.org/api/2.80/bpy.ops.mesh.html)
def make_object_mesh(arg_objectname="Default",arg_objecttype="Cube") -> bool:
    """メッシュオブジェクトの作成
    
    オブジェクト作成関数のマニュアル
    (https://docs.blender.org/api/2.80/bpy.ops.mesh.html)

    Keyword Arguments:
        arg_objectname {str} -- 作成オブジェクト名 (default: {"Default"})
        arg_objecttype {str} -- 作成メッシュタイプ (default: {"Cube"})
    
    Returns:
        bool -- 作成の正否
    """
    
    # もし同名のメッシュオブジェクトが既に存在していれば新規作成しない
    if arg_objectname in bpy.data.meshes:
        return False
    # 作成するオブジェクトを判定
    if arg_objecttype == "Cube":
        # Cubeオブジェクトを作成する
        bpy.ops.mesh.primitive_cube_add(
            size=2.0,
            location=(0.0, 0.0, 0.0),
            rotation=(0.0, 0.0, 0.0)
            )
    elif arg_objecttype == "Sphere":
        # UV_Sphereオブジェクトを作成する
        bpy.ops.mesh.primitive_uv_sphere_add(
            segments=32,
            ring_count=16,
            radius=1.0,
            location=(0.0, 0.0, 0.0),
            rotation=(0.0, 0.0, 0.0)
            )
    elif arg_objecttype == "Cone":
        # Coneオブジェクトを作成する
        bpy.ops.mesh.primitive_cone_add(
            vertices=32,
            radius1=1.0,
            radius2=0.0,
            depth=2.0,
            location=(0.0, 0.0, 0.0),
            rotation=(0.0, 0.0, 0.0)
            )
    elif arg_objecttype == "Torus":
        # Coneオブジェクトを作成する
        bpy.ops.mesh.primitive_torus_add(
            major_segments=48,
            minor_segments=12,
            major_radius=1.0,
            minor_radius=0.25,
            abso_major_rad=1.25,
            abso_minor_rad=0.75,
            location=(0.0, 0.0, 0.0),
            rotation=(0.0, 0.0, 0.0)
            )
    else:
        # エンプティオブジェクトを作成する
        bpy.ops.object.empty_add(
            type='PLAIN_AXES',
            location=(0.0, 0.0, 0.0),
            rotation=(0.0, 0.0, 0.0)
            )
    # 作成したオブジェクトの参照を取得する
    ob = bpy.context.view_layer.objects.active
    # オブジェクト名を変更する
    ob.name = arg_objectname
    # スケールを変更する
    ob.scale=( 1, 1, 1 )
    # 選択状態を解除する
    ob.select_set(False)
    return True


# 関数の実行例
make_object_mesh(
    arg_objectname="MakeObject",
    arg_objecttype="Sphere"
    )

f:id:bluebirdofoz:20191225011935j:plain

対象オブジェクトの削除

名前で指定したオブジェクトを削除します。
オブジェクトが存在しない場合は何もしません。
・delete_object_target.py

# bpyインポート
import bpy

# 指定オブジェクトの削除
def delete_object_target(arg_objectname=""):
    """指定オブジェクトの削除
    
    Keyword Arguments:
        arg_objectname {str} -- 削除するオブジェクト名 (default: {""})
    """
    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    targetob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if targetob != None:
        # オブジェクトが存在する場合は削除を行う
        bpy.data.objects.remove(targetob)
    
    return

# 関数の実行例
delete_object_target(arg_objectname="Cube")

f:id:bluebirdofoz:20191225012145j:plain

全オブジェクトの削除

全てのオブジェクトを削除します。
新規プロジェクト作成時に、プロジェクトを真っ新にしたい場合などに便利です。
・delete_object_all.py

# bpyインポート
import bpy

# 全オブジェクトの削除
def delete_object_all():
    """全オブジェクトの削除
    """
    # 全シーンオブジェクトを削除する
    for item in bpy.context.scene.collection.objects:
        bpy.context.scene.collection.objects.unlink(item)
    # 全データオブジェクトを削除する
    for item in bpy.data.objects:
        bpy.data.objects.remove(item)
    # 全メッシュデータを削除する
    for item in bpy.data.meshes:
        bpy.data.meshes.remove(item)
    # 全マテリアルデータを削除する
    for item in bpy.data.materials:
        bpy.data.materials.remove(item)
    return

# 関数の実行例
delete_object_all()

f:id:bluebirdofoz:20191225011955j:plain