MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その64(UVレイヤーのレンダー設定)

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

レンダー設定がアクティブなUVマップレイヤーの参照を取得する

レンダー設定がアクティブなUVマップレイヤーの参照を取得します。
オブジェクトのレンダリング実行時にはこのレンダー設定がアクティブなUVマップレイヤーが利用されます。
・get_uvlayer_renderactive.py

# bpyインポート
import bpy

# レンダリング時に有効なUVマップレイヤーを取得する
def get_uvlayer_renderactive(arg_object:bpy.types.Object) -> bpy.types.MeshUVLoopLayer:
    """レンダリング時に有効なUVマップレイヤーを取得する

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト

    Returns:
        bpy.types.MeshUVLoopLayer: 有効なUVマップレイヤーの参照
    """

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

    # 対象オブジェクトのメッシュデータを取得する
    # メッシュデータ操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Mesh.html)
    meshdata = arg_object.data

    # UVマップレイヤーのリストを取得する
    # UVマップレイヤーのリスト操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html)
    uv_layers = meshdata.uv_layers

    # レンダー設定がアクティブなUVマップを取得する
    active_uvlayer = None

    # UVマップレイヤーを全て走査する
    for uv_layer in uv_layers:
        # レンダー設定の有効無効を判定する
        # UVマップレイヤー操作のマニュアル
        # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html)
        if uv_layer.active_render:
            # レンダー設定がアクティブなUVマップを取得する
            active_uvlayer = uv_layer

    return active_uvlayer

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
renderactive_uvlayer = get_uvlayer_renderactive(arg_object=target_obj)
print("render active = " + renderactive_uvlayer.name)

f:id:bluebirdofoz:20200903185919j:plain

指定のUVマップレイヤーのレンダー設定をアクティブに変更します

指定のUVマップレイヤーのレンダー設定をアクティブに変更します
オブジェクトのレンダリング実行時にはこのレンダー設定がアクティブなUVマップレイヤーが利用されます。
・set_uvlayer_renderactive.py

# bpyインポート
import bpy
# 指定のオブジェクトの指定UVマップレイヤーのレンダー設定をアクティブにする
def set_uvlayer_renderactive(arg_object:bpy.types.Object,
  arg_uvlayername:str) -> bpy.types.MeshUVLoopLayer:
    """指定のオブジェクトの指定UVマップレイヤーのレンダー設定をアクティブにする

    Args:
        arg_object (bpy.types.Object): 指定オブジェクト
        arg_uvlayername (str): 指定UVマップレイヤー名

    Returns:
        bpy.types.MeshUVLoopLayer: UVマップレイヤーの参照
    """

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

    # 対象オブジェクトのメッシュデータを取得する
    # メッシュデータ操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.Mesh.html)
    meshdata = arg_object.data

    # UVマップレイヤーのリストを取得する
    # UVマップレイヤーのリスト操作のマニュアル
    # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html)
    uv_layers = meshdata.uv_layers

    # UVマップレイヤーを取得する
    # (get関数は対象が存在しない場合 None が返る)
    target_uvlayer = uv_layers.get(arg_uvlayername)

    # 指定UVマップレイヤーが存在するか確認する
    if target_uvlayer == None:
        # 指定UVマップレイヤーが存在しない場合は処理しない
        return None
    
    # レンダー設定がアクティブなUVマップを取得する
    active_uvlayer = None

    # UVマップレイヤーを走査する
    for uv_layer in uv_layers:
        # 指定のUVマップレイヤーか確認する
        # UVマップレイヤー操作のマニュアル
        # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html)
        if uv_layer == target_uvlayer:
            # 指定のUVマップレイヤーであればレンダー設定をアクティブにする
            uv_layer.active_render = True
            # レンダー設定がアクティブなUVマップを取得する
            active_uvlayer = uv_layer
        else:
            # 指定のUVマップレイヤーでなければレンダー設定を非アクティブにする
            uv_layer.active_render = False

    return active_uvlayer

# 関数の実行例
target_obj = bpy.data.objects.get("Cube")
renderactive_uvlayer = set_uvlayer_renderactive(
    arg_object=target_obj,
    arg_uvlayername="UVMap.002"
)
print("render active = " + renderactive_uvlayer.name)

f:id:bluebirdofoz:20200903185907j:plain