MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その10(頂点カラーのベイク)

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

頂点カラーのベイクを実行

シーン中の全てのメッシュオブジェクトに対して、テクスチャカラーを頂点カラーにベイクします。
シーン名は'Scene'で指定しています。

・bake_vertexcolor.py

# bpyインポート
import bpy

# 頂点カラーのベイク(全メッシュオブジェクト)
# 全メッシュオブジェクトの頂点カラーにベイク処理を行う
# 対称シーンの名称は"Scene"で固定
# 引数
# 戻り値
def bake_vertexcolor_all():
   # シーン中の全てのオブジェクトを走査する
   for ob in bpy.context.scene.objects:
     # 一旦全てのオブジェクトを非選択状態に設定する
     ob.select=False

   # [頂点カラーにベイク]を有効にする
   bpy.data.scenes['Scene'].render.use_bake_to_vertex_color = True

   # ベイクモードを「テクスチャ」に設定する
   bpy.data.scenes['Scene'].render.bake_type = "TEXTURE"

   # シーン中の全てのオブジェクトを走査する
   for ob in bpy.context.scene.objects:
     # オブジェクトがメッシュならベイク処理の対象とする
     if ob.type == 'MESH':

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

       # オブジェクトを選択状態にする
       ob.select = True

       # 頂点ペイントモードに移行する
       bpy.ops.object.mode_set(mode='VERTEX_PAINT', toggle=False)

       # ベイクを実行する
       bpy.ops.object.bake_image()

       # オブジェクトを非選択状態にする
       ob.select = False

   return

# 関数の実行例
bake_vertexcolor_all()

f:id:bluebirdofoz:20190528081605j:plain

オブジェクトを頂点カラーで表示

全てのメッシュオブジェクトのマテリアル設定を頂点カラーによる表示に切り替えます。。
全マテリアルの参照を切るため、プロジェクトの保存には注意が必要です。

・show_vertexcolor.py

# bpyインポート
import bpy

# 全てのメッシュオブジェクトで頂点カラー表示
# 全てのマテリアルを削除してメッシュオブジェクトに
# 頂点カラー表示のマテリアルを設定し直す
# (全マテリアルの参照を切るため、保存には要注意)
# 引数
# 戻り値
def show_vertexcolor_all():
   # シーン中の全てのオブジェクトを走査する
   for ob in bpy.context.scene.objects:
     # 一旦全てのオブジェクトを非選択状態に設定する
     ob.select=False

   # シーン中の全てのオブジェクトを走査する
   for ob in bpy.context.scene.objects:
     # オブジェクトがメッシュなら一旦マテリアルスロットを初期化する
     if ob.type == 'MESH':

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

       # マテリアルスロットを走査する
       for material_slot in ob.material_slots:

         # マテリアルスロットをアクティブにする
         ob.active_material = material_slot.material

         # マテリアルスロットを削除する
         bpy.ops.object.material_slot_remove()

   # 新規マテリアルの作成
   bpy.ops.material.new()

   # 新規マテリアルの参照を取得する
   # (新規マテリアルはリストの終端に追加されている)
   vertexmaterial = bpy.data.materials[-1]

   # 頂点カラー表示の設定
   vertexmaterial.use_vertex_color_paint = True

   # シーン中の全てのオブジェクトを走査する
   for ob in bpy.context.scene.objects:
     # オブジェクトがメッシュならベイク処理の対象とする
     if ob.type == 'MESH':

       # 頂点カラーのマテリアルを設定する
       ob.active_material = vertexmaterial

   return

# 関数の実行例
show_vertexcolor_all()

f:id:bluebirdofoz:20190528081617j:plain