本日は 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")
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")
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")