本日は 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) )
対象オブジェクトの頂点カラーレイヤーが黒一色(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))