LoginSignup
1
3

More than 3 years have passed since last update.

マテリアルのアニメーションをベイクするスクリプト

Posted at

Blender内でマテリアルにつけたアニメーションを他のソフトに持っていきたい
といった趣旨の話題を見かけて
21032701.gif
そういったデータを受け渡しのできるフォーマットもないので
マテリアルをベイクした連番画像を作成できればいいのでは?と思い作成してみました

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 といった具合に画像ファイルを出力します。
image.png
書き出しするフレームはレンダリング範囲にしているフレーム
書き出すマテリアルはアクティブなもののみ、
書き出しに利用するUVはオブジェクトデータで選択されているUVマップになります。

今回はシンプルな機能のみですが要望があればアドオン化したいと思います

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3