MRが楽しい

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

Blender2.8で利用可能なpythonスクリプトを作る その29(頂点カラーの設定と判定)

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

対象オブジェクトの頂点カラーレイヤーの全頂点を指定色で塗り潰す

対象オブジェクトの指定名称の頂点カラーレイヤーの全頂点を指定色で塗り潰します。
カラーは 0.0 ~ 1.0 の範囲で設定される RGBA を指定します。
・paint_vertexcolor_rgba.py

# bpyインポート
import bpy

# 対象オブジェクトの指定名称の頂点カラーレイヤーの全頂点を指定色で塗り潰す
def paint_vertexcolor_rgba(arg_objectname="Default", arg_checkname="Col", arg_paintrgba=(0.0, 0.0, 0.0, 1.0)) -> bool:
    """対象オブジェクトの指定名称の頂点カラーレイヤーの全頂点を指定色で塗り潰す

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_checkname {str} -- 対象頂点カラーレイヤー名 (default: {"Col"})
        arg_paintrgba {tuple} -- 指定色 (default: {(0.0, 0.0, 0.0, 1.0)})

    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
    
    # 頂点カラーレイヤーを取得する
    # 頂点カラーレイヤーのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.MeshLoopColorLayer.html)
    target_vertexcolor = vertexcolors.get(arg_checkname)
    
    # 指定名称の頂点カラーレイヤーが存在するか確認する
    if target_vertexcolor == None:
        # 指定名称の頂点カラーレイヤーが存在しなければ False を返す
        return False

    # 頂点カラーデータの各頂点カラーを取得する
    # 頂点カラーデータの各頂点カラーのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.MeshLoopColor.html)
    for loopcolor in target_vertexcolor.data:
        # 各頂点カラーの色を指定色で設定する
        loopcolor.color = arg_paintrgba

    return True


# 関数の実行例
# 赤
result01 = paint_vertexcolor_rgba(
    arg_objectname="Sphere01",
    arg_checkname="Col",
    arg_paintrgba=(1.0, 0.0, 0.0, 1.0)
)
# 緑
result01 = paint_vertexcolor_rgba(
    arg_objectname="Sphere02",
    arg_checkname="Col",
    arg_paintrgba=(0.0, 1.0, 0.0, 1.0)
)
# 青
result01 = paint_vertexcolor_rgba(
    arg_objectname="Sphere03",
    arg_checkname="Col",
    arg_paintrgba=(0.0, 0.0, 1.0, 1.0)
)

f:id:bluebirdofoz:20200519085254j:plain

対象オブジェクトの頂点カラーレイヤーが黒一色(R:25,G:25,B:25 以下)か判定する

対象オブジェクトの指定名称の頂点カラーレイヤーが黒一色(R:25,G:25,B:25 以下)の場合は True を返します。
1つでも黒(R:25,G:25,B:25 以下)でない頂点カラーの頂点が存在する場合は False を返します。
・check_vertexcolor_name.py

# bpyインポート
import bpy

# 対象オブジェクトの指定名称の頂点カラーレイヤーが黒一色(R:25,G:25,B:25 以下)か判定する
def judge_vertexcolor_black(arg_objectname="Default", arg_checkname="Col") -> bool:
    """対象オブジェクトの指定名称の頂点カラーレイヤーが黒一色(R:25,G:25,B:25 以下)か判定する

    Keyword Arguments:
        arg_objectname {str} -- 対象オブジェクト名 (default: {"Default"})
        arg_checkname {str} -- 対象頂点カラーレイヤー名 (default: {"Col"})

    Returns:
        bool -- 黒一色(R:25,G:25,B:25 以下)か否か
    """

    # 指定オブジェクトを取得する
    # (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
    
    # 頂点カラーレイヤーを取得する
    # 頂点カラーレイヤーのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.MeshLoopColorLayer.html)
    target_vertexcolor = vertexcolors.get(arg_checkname)
    
    # 指定名称の頂点カラーレイヤーが存在するか確認する
    if target_vertexcolor == None:
        # 指定名称の頂点カラーレイヤーが存在しなければ False を返す
        return False

    # 頂点カラーデータの各頂点カラーを取得する
    # 頂点カラーデータの各頂点カラーのインタフェース
    # (https://docs.blender.org/api/current/bpy.types.MeshLoopColor.html)
    for loopcolor in target_vertexcolor.data:
        # 各頂点カラーの色を取得する
        vertexcolor = loopcolor.color
        # 頂点カラーが黒色(R:25,G:25,B:25 以下)か確認する
        if vertexcolor[0] > 0.1 and vertexcolor[1] > 0.1 and vertexcolor[2] > 0.1:
            # 黒色でない色が存在すれば False を返す
            return False

    # 全ての頂点カラーが黒色(R:25,G:25,B:25 以下)だった場合は True を返す
    return True


# 関数の実行例
result01 = judge_vertexcolor_black(
    arg_objectname="Sphere01",
    arg_checkname="Col"
)
print("Sphere01 is black : " + str(result01))

result01 = judge_vertexcolor_black(
    arg_objectname="Sphere02",
    arg_checkname="Col"
)
print("Sphere02 is black : " + str(result01))

result01 = judge_vertexcolor_black(
    arg_objectname="Sphere03",
    arg_checkname="Col"
)
print("Sphere03 is black : " + str(result01))

f:id:bluebirdofoz:20200519085306j:plain