MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その28(頂点カラーレイヤーの作成と取得)

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

対象オブジェクトに新規頂点カラーレイヤーを作成する

対象オブジェクトに新規頂点カラーレイヤーを作成します。
作成した頂点カラーレイヤーの名称を返します。作成失敗時は空文字を返します。
・check_vertexcolor_name.py

# bpyインポート
import bpy

# 対象オブジェクトに新規頂点カラーレイヤーを作成する
def add_vertexcolor_target(arg_objectname="Default") -> str:
    """対象オブジェクトに新規頂点カラーレイヤーを作成する

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

    Returns:
        str -- 作成した頂点カラーレイヤーの名前(作成失敗は空文字)
    """

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

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

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

    # 頂点カラーレイヤーを作成する
    bpy.ops.mesh.vertex_color_add()

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

    # 頂点カラーレイヤーのリストを取得する
    # 頂点カラーレイヤーのリストのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.LoopColors.html)
    vertexcolors = meshdata.vertex_colors

    # 作成した頂点カラーレイヤーの参照を取得する
    add_vertexcolor = vertexcolors[-1]

    return add_vertexcolor.name

# 関数の実行例
add_name = add_vertexcolor_target(arg_objectname="Sphere")
print("result : " + add_name)

f:id:bluebirdofoz:20200518205730j:plain

対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする

対象オブジェクトに指定名称の頂点カラーレイヤーが設定されている場合は True を返します。
指定名称の頂点カラーレイヤーが存在しない場合や、頂点カラーレイヤーが1つも存在しない場合は False を返します。
・check_vertexcolor_name.py

# bpyインポート
import bpy

# 対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする
def check_vertexcolor_name(arg_objectname="Default", arg_checkname="Col") -> bool:
    """対象オブジェクトに指定名称の頂点カラーレイヤーが設定されているかチェックする

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

    Returns:
        bool -- 頂点カラーレイヤーの有無
    """

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

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

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

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

    # 頂点カラーレイヤーのリストを取得する
    # 頂点カラーレイヤーのリストのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.LoopColors.html)
    vertexcolors = meshdata.vertex_colors

    # 頂点カラーレイヤーの数を確認する
    if len(vertexcolors) < 1:
        # 頂点カラーレイヤーが1つも存在しなければ False を返す
        return False
    
    # 指定名称の頂点カラーレイヤーを取得する
    # (get関数は対象が存在しない場合 None が返る)
    target_vertexcolor = vertexcolors.get(arg_checkname)
    
    # 指定名称の頂点カラーレイヤーが存在するか確認する
    if target_vertexcolor == None:
        # 指定名称の頂点カラーレイヤーが存在しなければ False を返す
        return False

    # 指定名称の頂点カラーレイヤーが存在していれば True を返す
    return True

# 関数の実行例
result = check_vertexcolor_name(
    arg_objectname="Sphere",
    arg_checkname="Col"
)
print("result : " + str(result))

f:id:bluebirdofoz:20200518205742j:plain

レンダリング時に有効な頂点カラーレイヤーの名前を取得する

レンダリング時に有効な頂点カラーレイヤーの名称を返します。
取得失敗時は空文字を返します。
・get_vertexcolor_active.py

# bpyインポート
import bpy

# レンダリング時に有効な頂点カラーレイヤーの名前を取得する
def get_vertexcolor_active(arg_objectname="Default") -> str:
    """レンダリング時に有効な頂点カラーレイヤーの名前を取得する

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

    Returns:
        str -- レンダリング時に有効な頂点カラーレイヤーの名前(取得失敗は空文字)
    """

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

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

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

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

    # 頂点カラーレイヤーのリストを取得する
    # 頂点カラーレイヤーのリストのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.LoopColors.html)
    vertexcolors = meshdata.vertex_colors

    # 変数の初期化
    render_index = -1

    # 頂点カラーレイヤーを走査する
    for index in range(0, len(vertexcolors)):
        # レンダリング時の有効無効をチェックする
        if vertexcolors[index].active_render == True:
            # レンダリング時に有効な頂点カラーレイヤーのインデックスを取得する
            render_index = index

    # 有効なインデックスが取得できたか確認する
    if render_index == -1:
        # 取得できなかった場合は空文字を返す
        return ""

    # レンダリング時に有効な頂点カラーレイヤーの参照を取得する
    active_vertexcolor = vertexcolors[render_index]

    return active_vertexcolor.name

# 関数の実行例
get_name = get_vertexcolor_active(arg_objectname="Sphere")
print("result : " + get_name)

f:id:bluebirdofoz:20200519085351j:plain