MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その34(UVマップの作成と削除)

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

UVマップの作成

指定オブジェクトにUV展開を実行してUVマップを作成します。
・project_UVmap_mesh.py

# bpyインポート
import bpy

# UV展開を実行する(デフォルト設定)
def project_UVmap_mesh(arg_objectname="Default") -> bool:
    """UV展開を実行する(デフォルト設定)

    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"})

    Returns:
        bool -- 実行正否
    """

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # オブジェクトがメッシュであるか確認する
    if selectob.type != 'MESH':
        # 指定オブジェクトがメッシュでない場合は処理しない
        return False
    
    # 不要なオブジェクトを選択しないように
    # 全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定のオブジェクトのみを選択状態にする
    selectob.select_set(True)

    # 対象オブジェクトをアクティブに変更する
    bpy.context.view_layer.objects.active = selectob

    # 元々の操作モードを記録する
    befmode = bpy.context.active_object.mode

    # 編集モードに移行する
    bpy.ops.object.mode_set(mode='EDIT', toggle=False)
   
    # 頂点を全選択した状態とする
    bpy.ops.mesh.select_all(action='SELECT')

    # デフォルト設定のUV展開を実行する
    bpy.ops.uv.unwrap()

    # オブジェクトモードに移行する
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
   
    # 変更前のモードに移行する
    bpy.ops.object.mode_set(mode=befmode)

    return

# 関数の実行例
project_UVmap_mesh(arg_objectname="Sphere")

f:id:bluebirdofoz:20200531203214j:plain

UVマップの作成(スマートUV展開)

指定オブジェクトにスマートUV展開を実行してUVマップを作成します。
smart_project関数の引数を変更することでスマートUV展開のルールを変更できます。
・smartproject_UVmap_mesh.py

# bpyインポート
import bpy

# スマートUV展開を実行する(デフォルト設定)
def smartproject_UVmap_mesh(arg_objectname="Default") -> bool:
    """スマートUV展開を実行する(デフォルト設定)

    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"})

    Returns:
        bool -- 実行正否
    """

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # オブジェクトがメッシュであるか確認する
    if selectob.type != 'MESH':
        # 指定オブジェクトがメッシュでない場合は処理しない
        return False
    
    # 不要なオブジェクトを選択しないように
    # 全てのオブジェクトを走査する
    for ob in bpy.context.scene.objects:
        # 非選択状態に設定する
        ob.select_set(False)

    # 指定のオブジェクトのみを選択状態にする
    selectob.select_set(True)

    # 対象オブジェクトをアクティブに変更する
    bpy.context.view_layer.objects.active = selectob

    # 元々の操作モードを記録する
    befmode = bpy.context.active_object.mode

    # 編集モードに移行する
    bpy.ops.object.mode_set(mode='EDIT', toggle=False)
   
    # 頂点を全選択した状態とする
    bpy.ops.mesh.select_all(action='SELECT')

    # デフォルト設定のスマートUV展開を実行する
    # 角度制限:66,島の余白:0,エリアウェイト:0,アスペクト比の補正:True,UV境界に合わせる:True
    bpy.ops.uv.smart_project(angle_limit=66, island_margin=0, 
      user_area_weight=0, use_aspect=True, stretch_to_bounds=True)

    # オブジェクトモードに移行する
    bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
   
    # 変更前のモードに移行する
    bpy.ops.object.mode_set(mode=befmode)

    return

# 関数の実行例
smartproject_UVmap_mesh(arg_objectname="Sphere")

f:id:bluebirdofoz:20200526203812j:plain

UVマップの削除

指定オブジェクトが保持する全てのUVマップを削除します。
UVマップはオブジェクトではなくメッシュデータに紐づいています。
このため、同じメッシュデータを参照する全てのオブジェクトが影響を受けます。
・delete_UVmap_mesh.py

# bpyインポート
import bpy

# UVマップの削除を実行する
def delete_UVmap_mesh(arg_objectname="Default") -> bool:
    """UVマップの削除を実行する

    Keyword Arguments:
        arg_objectname {str} -- 指定オブジェクト名 (default: {"Default"})

    Returns:
        bool -- 実行正否
    """

    # 指定オブジェクトを取得する
    # (get関数は対象が存在しない場合 None が返る)
    selectob = bpy.data.objects.get(arg_objectname)

    # 指定オブジェクトが存在するか確認する
    if selectob == None:
        # 指定オブジェクトが存在しない場合は処理しない
        return False
    
    # オブジェクトがメッシュであるか確認する
    if selectob.type != 'MESH':
        # 指定オブジェクトがメッシュでない場合は処理しない
        return False

    # オブジェクトからメッシュデータを取得する
    # メッシュデータのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.Mesh.html)
    meshdata = selectob.data

    # UVマップのリストを取得する
    # UVマップのリストのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html)
    uvlayers = meshdata.uv_layers

    # UVマップが全て削除されるまでループ
    for loop_index in range(len(uvlayers)):
      # 先頭のUVマップを選択状態にする
      meshdata.uv_layers.active_index=0

      # UVマップを削除する
      bpy.ops.mesh.uv_texture_remove()
   
    return

# 関数の実行例
delete_UVmap_mesh(arg_objectname="Sphere")

f:id:bluebirdofoz:20200526203824j:plain