MRが楽しい

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

Blender2.8で[選択物->アクティブ]のベイクで色が混ざる場合の対処

本日は Blender2.8 の小ネタ枠です。
Blender2.8で[選択物->アクティブ]のベイクで色が混ざる場合の対処について記事にします。

[選択物->アクティブ]のベイク

ベイク実行時に[選択物->アクティブ]を有効にすることで、異なるオブジェクト間でベイクを行うことができます。
ハイポリゴンなモデルからローポリゴンなモデルへの法線焼き込みのほか、UVの異なるカラーベイクに活用することができます。
f:id:bluebirdofoz:20200814050024j:plain

色が混ざる事象

例えば同じ形状のオブジェクト同士で本機能を利用した場合、メッシュのレイが上手くヒットせず、色が混ざり合う事があります。
f:id:bluebirdofoz:20200814050039j:plain

このような場合は[レイの距離]に距離に設定することで、色が混ざるのを防げることがあります。
f:id:bluebirdofoz:20200814050049j:plain

デフォルトの[レイの距離]は 0 mで、この場合、レイはアクティブオブジェクトから内側に飛ばされます。
数値を設定すると、アクティブオブジェクトから指定距離の外側からレイが飛ばされるようになり、レイがヒットしてほしいメッシュにヒットするよう調整できます。
f:id:bluebirdofoz:20200814050101j:plain

pythonスクリプト

本処理を python スクリプトで記述した例を以下に示します。

# 現在選択中のオブジェクトからアクティブオブジェクトへカラー情報をベイクする
def bake_diffuse_coloronly():
    """現在選択中のオブジェクトからアクティブオブジェクトへカラー情報をベイクする
    """

    # レンダリングエンジンを CYCLES に切り替える
    bpy.context.scene.render.engine = 'CYCLES'

    # GPUの設定を行う
    bpy.data.scenes["Scene"].cycles.device = 'GPU'
    # CUDAを選択する
    bpy.context.preferences.addons['cycles'].preferences.compute_device_type = 'CUDA'
    # デバイスの一覧を取得する
    for devices in bpy.context.preferences.addons['cycles'].preferences.get_devices():
        for device in devices:
            # デバイスタイプがCUDAならば利用対象とする
            if device.type == 'CUDA':
                print("利用可能なGPUを検出しました:" + device.name)
                device.use = True

    # render.bake の設定項目を予め設定する
    bake_setting = bpy.context.scene.render.bake

    # ベイクの影響から直接照明を無効化する
    bake_setting.use_pass_direct = False

    # ベイクの影響から間接照明を無効化する
    bake_setting.use_pass_indirect = False

    # ベイクの影響からカラーを有効化する
    bake_setting.use_pass_color = True

    # [選択->アクティブ]のベイクを有効化する
    bake_setting.use_selected_to_active = True

    # レイの距離を 0.01 に設定する
    bake_setting.cage_extrusion = 0.01

    # ディフューズタイプのベイクを実行する
    # ベイクの種類
    # ('COMBINED', 'AO', 'SHADOW', 'NORMAL', 'UV', 'ROUGHNESS',
    # 'EMIT', 'ENVIRONMENT', 'DIFFUSE', 'GLOSSY', 'TRANSMISSION')
    # (render.bake 以外の設定は引数で指定する必要あり)
    bpy.ops.object.bake(type='DIFFUSE', margin=16)

    return