MRが楽しい

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

Blenderで利用可能なpythonスクリプトを作る その19(新規画像作成とテクスチャベイクの実行)

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

新規画像作成とテクスチャベイクの実行

スクリプトではベイク元オブジェクトとベイク先オブジェクトを指定します。
ベイク元オブジェクトを参照し、ベイク先オブジェクトにテクスチャベイクが実行されます。
ベイクしたテクスチャはPNG形式で指定のディレクトリに保存されます。
スクリプトを実行するには1つ以上の[3Dビュー]ウィンドウが必要です。
・bake_texture.py

# bpyインポート
import bpy

# ベイク元オブジェクトからベイク先オブジェクトへベイクを実行する
# 引数   arg_sourcename:ベイク元オブジェクト名
#        arg_destinationname:ベイク先オブジェクト名
#        arg_savefiledir:ベイク画像保存ファイルディレクトリ
#        arg_savefilename:ベイク画像保存ファイル名
# 戻り値
def bake_texture_select2active(
  arg_sourcename='Default',arg_destinationname='Default',
  arg_savefilepath='D:\\WORK\\Texture',
  arg_savefilename='NewTexture'):
  # 他のオブジェクトに操作を適用しないよう全てのオブジェクトを走査する
  for ob in bpy.context.scene.objects:
    # 非選択状態に設定する
    ob.select=False
  # ベイク先オブジェクトを取得する
  destinationob = bpy.context.scene.objects[arg_destinationname]
  # ベイク先オブジェクトをアクティブに変更する
  bpy.context.scene.objects.active=destinationob
  # 編集モードに移行する
  bpy.ops.object.mode_set(mode='EDIT', toggle=False)
  # 頂点を全選択した状態とする
  bpy.ops.mesh.select_all(action='SELECT')

  # 新規画像を作成する
  bakeimage=bpy.data.images.new(name=arg_savefilename, width=1024, height=1024, alpha=True)
  # 保存ファイルパスを作成する
  savepath=arg_savefilepath + '\\' + arg_savefilename + '.png'
  # 保存ファイルパスを指定する
  bakeimage.filepath_raw = savepath
  # ファイルフォーマットをPNGに設定する
  bakeimage.file_format = 'PNG'
  # 画像を一旦保存する(初期化のため)
  bakeimage.save()

  # 全てのスクリーンを走査する
  for area in bpy.context.screen.areas:
    # エリアタイプが3Dビューであるか
    if area.type == 'VIEW_3D':
      # エリアタイプをUV画像エディターに変更する
      area.type='IMAGE_EDITOR'
      # エディター内の各領域を走査する
      for space in area.spaces:
        # 領域が画像エディターの表示領域であるか
        if space.type == 'IMAGE_EDITOR':
          # 画像エディターの表示領域の作成した画像を設定する
          space.image=bakeimage

  # ベイク元オブジェクトを取得する
  sourceob = bpy.context.scene.objects[arg_sourcename]
  # ベイク元オブジェクトを選択状態にする
  sourceob.select=True
  # ベイク先オブジェクトを選択状態にする
  destinationob.select=True
  # ベイクモードを「テクスチャ」に設定する
  bpy.data.scenes['Scene'].render.bake_type="TEXTURE"
  # ベイク先を「選択→アクティブ」を有効に設定する
  bpy.context.scene.render.use_bake_selected_to_active=True
  # ベイク処理を実行する
  bpy.ops.object.bake_image()
  # 画像を再保存する
  bakeimage.save()
  
  # 全てのスクリーンを走査する
  for area in bpy.context.screen.areas:
    # エリアタイプがUV画像エディターであるか
    if area.type == 'IMAGE_EDITOR':
      # エリアタイプを3Dビューに戻す
      area.type='VIEW_3D'

  # ベイク先オブジェクトをオブジェクトモードに戻す
  bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
  return

# 関数の実行例
bake_texture_select2active(
    arg_sourcename='BakeFrom',arg_destinationname='BakeTo',
    arg_savefilepath='D:\\WORK\\Texture',arg_savefilename='BakeTexture')

f:id:bluebirdofoz:20190628222631j:plain
f:id:bluebirdofoz:20190628222646j:plain

ベイク結果をテクスチャに出力するため、ベイク先のオブジェクトはUVマップを保持している必要があります。
前回のUVマップの作成と組み合わせて利用すると、UVマップの展開を含めたベイク作業を自動化できます。
bluebirdofoz.hatenablog.com