Blender内でマテリアルにつけたアニメーションを他のソフトに持っていきたい
といった趣旨の話題を見かけて
そういったデータを受け渡しのできるフォーマットもないので
マテリアルをベイクした連番画像を作成できればいいのでは?と思い作成してみました
y_BakeMaterialAnimation.py
import bpy
import os
# ベイクする画像のサイズ
img_width = 1024
img_height = 1024
# ベイク用のノードの作成
def criete_bake_terget(mat, image, uv_layer):
node_tree = mat.node_tree
img_node = node_tree.nodes.new("ShaderNodeTexImage")
img_node.image = image
uv_node = node_tree.nodes.new("ShaderNodeUVMap")
uv_node.uv_map = uv_layer.name
node_tree.links.new( uv_node.outputs[0], img_node.inputs[0] )
#ベイク対象はアクティブなノード
node_tree.nodes.active = img_node
return(img_node, uv_node)
# ベイク用マテリアルの消去
def crean_beke_terget(mat, beke_nodes):
img_node = beke_nodes[0]
uv_node = beke_nodes[1]
mat.node_tree.nodes.remove(img_node)
mat.node_tree.nodes.remove(uv_node)
scene = bpy.context.scene
#選択されているオブジェクトを取得
active_object = bpy.context.active_object
mat = active_object.active_material
# 保存先の設定
render_fpath = scene.render.filepath
save_dir = os.path.dirname(render_fpath)
# ベイク対象の画像の作成
img_name = "bake_image"
image_object = bpy.data.images.new(name=img_name, width=img_width, height= img_height)
# 選択しているUVの取得
uv_layer = active_object.data.uv_layers[ active_object.data.uv_layers.active_index ]
# アニメーション範囲の取得
frame_start = scene.frame_start
frame_end = scene.frame_end
# ベイク用ノードの作成
nodes = criete_bake_terget(mat, image_object, uv_layer)
# 現在のレンダリング設定の退避
ref_engine = scene.render.engine
scene.render.engine = 'CYCLES'
# 現在のサンプル数の退避
ref_sampkung = scene.cycles.samples
scene.cycles.samples = 8
# アニメーションのベイク
for t in range(frame_start,frame_end +1) :
# シーケンスカーソルの移動
bpy.context.scene.frame_set( t )
# ベイク
bpy.ops.object.bake(type='DIFFUSE', pass_filter={'COLOR',}, use_clear=False)
# 画像の保存名
f_name = "bake_%s.png" % (str(t).zfill(6))
img_path = os.path.join(save_dir,f_name)
#画像の保存
image_object.save_render(filepath=img_path)
# サンプリング数を元に
scene.cycles.samples = ref_sampkung
# レンダリングエンジンを元に
scene.render.engine = ref_engine
# ベイク用マテリアルの消去
crean_beke_terget(mat, nodes)
アドオンでなく スクリプトエディッタで実行するスクリプトです。
スクリプトを実行すると アウトプットプロパティの出力パスに設定してある場所に
bake_000000.png といった具合に画像ファイルを出力します。
書き出しするフレームはレンダリング範囲にしているフレーム
書き出すマテリアルはアクティブなもののみ、
書き出しに利用するUVはオブジェクトデータで選択されているUVマップになります。
今回はシンプルな機能のみですが要望があればアドオン化したいと思います