本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
頂点カラーをテクスチャにベイクする
頂点カラーをテクスチャにベイクし、そのテクスチャを設定したプリンシプルBSDFのマテリアルを設定します。
アドオンとして追加されるパネルから以下の項目を設定して[VERTEX COLOR BAKE]ボタンをクリックで実行します。
Select Object:ベイクの実行対象オブジェクト Texture Name :作成テクスチャ名 Texture Size :作成テクスチャサイズ(指定辺長の正方形) Bake Margin :ベイク実行時の余白(px)
設定済みのマテリアルがある場合は全て削除されます。
対象オブジェクトにUVマップが存在しない場合はスマートUV展開でUV展開を行います。
レンダリング時に、GPUが利用可能な環境の場合は利用設定を行います。
・Addon_bake_vertexcolor_texture.py
# bl_infoでプラグインに関する情報の定義を行う bl_info = { "name": "HoloMon Vertex Color Bake Addon", # プラグイン名 "author": "HoloMon", # 制作者名 "version": (1, 0), # バージョン "blender": (2, 80, 0), # 動作可能なBlenderバージョン "support": "TESTING", # サポートレベル "category": "3D View", # カテゴリ名 "location": "View3D > Sidebar > HoloMon", # ロケーション "description": "Addon Vertex Color Bake", # 説明文 "location": "", # 機能の位置付け "warning": "", # 注意点やバグ情報 "doc_url": "", # ドキュメントURL } # 利用するタイプやメソッドのインポート import bpy from bpy.types import Operator, Panel, PropertyGroup from bpy.props import PointerProperty, IntProperty, StringProperty # 継承するクラスの命名規則は以下の通り # [A-Z][A-Z0-9_]*_(継承クラスごとの識別子)_[A-Za-z0-9_]+ # クラスごとの識別子は以下の通り # bpy.types.Operator OT # bpy.types.Panel PT # bpy.types.Header HT # bpy.types.MENU MT # bpy.types.UIList UL # Panelクラスの作成 # 参考URL:https://docs.blender.org/api/current/bpy.types.Panel.html class HOLOMON_PT_addon_vertex_color_bake(Panel): # パネルのラベル名を定義する # パネルを折りたたむパネルヘッダーに表示される bl_label = "Vertex Color Bake" # クラスのIDを定義する # 命名規則は CATEGORY_PT_name bl_idname = "HOLOMON_PT_addon_vertex_color_bake" # パネルを使用する領域を定義する # 利用可能な識別子は以下の通り # EMPTY:無し # VIEW_3D:3Dビューポート # IMAGE_EDITOR:UV/画像エディター # NODE_EDITOR:ノードエディター # SEQUENCE_EDITOR:ビデオシーケンサー # CLIP_EDITOR:ムービークリップエディター # DOPESHEET_EDITOR:ドープシート # GRAPH_EDITOR:グラフエディター # NLA_EDITOR:非線形アニメーション # TEXT_EDITOR:テキストエディター # CONSOLE:Pythonコンソール # INFO:情報、操作のログ、警告、エラーメッセージ # TOPBAR:トップバー # STATUSBAR:ステータスバー # OUTLINER:アウトライナ # PROPERTIES:プロパティ # FILE_BROWSER:ファイルブラウザ # PREFERENCES:設定 bl_space_type = 'VIEW_3D' # パネルが使用される領域を定義する # 利用可能な識別子は以下の通り # ['WINDOW'、 'HEADER'、 'CHANNELS'、 'TEMPORARY'、 'UI'、 # 'TOOLS'、 'TOOL_PROPS'、 'PREVIEW'、 'HUD'、 'NAVIGATION_BAR'、 # 'EXECUTE'、 'FOOTER'の列挙型、 'TOOL_HEADER'] bl_region_type = 'UI' # パネルタイプのオプションを定義する # DEFAULT_CLOSED:作成時にパネルを開くか折りたたむ必要があるかを定義する。 # HIDE_HEADER:ヘッダーを非表示するかを定義する。Falseに設定するとパネルにはヘッダーが表示される。 # デフォルトは {'DEFAULT_CLOSED'} bl_options = {'DEFAULT_CLOSED'} # パネルの表示順番を定義する # 小さい番号のパネルは、大きい番号のパネルの前にデフォルトで順序付けられる # デフォルトは 0 bl_order = 0 # パネルのカテゴリ名称を定義する # 3Dビューポートの場合、サイドバーの名称になる # デフォルトは名称無し bl_category = "HoloMon" # 描画の定義 def draw(self, context): # Operatorをボタンとして配置する draw_layout = self.layout # 要素行を作成する select_row = draw_layout.row() # オブジェクト選択用のカスタムプロパティを配置する select_row.prop(context.scene.holomon_vertex_color_bake, "prop_objectslect", text='') # 要素行を作成する length_row = draw_layout.row() # テクスチャ名指定用のカスタムプロパティを配置する length_row.prop(context.scene.holomon_vertex_color_bake, "prop_texturename") # 要素行を作成する length_row = draw_layout.row() # テクスチャサイズ指定用のカスタムプロパティを配置する length_row.prop(context.scene.holomon_vertex_color_bake, "prop_texturesize") # 要素行を作成する length_row = draw_layout.row() # ベイク余白指定用のカスタムプロパティを配置する length_row.prop(context.scene.holomon_vertex_color_bake, "prop_bakemargin") # 要素行を作成する button_row = draw_layout.row() # ベイクを実行するボタンを配置する button_row.operator("holomon.vertex_color_bake") # Operatorクラスの作成 # 参考URL:https://docs.blender.org/api/current/bpy.types.Operator.html class HOLOMON_OT_addon_vertex_color_bake(Operator): # クラスのIDを定義する # (Blender内部で参照する際のIDに利用) bl_idname = "holomon.vertex_color_bake" # クラスのラベルを定義する # (デフォルトのテキスト表示などに利用) bl_label = "VERTEX COLOR BAKE" # クラスの説明文 # (マウスオーバー時に表示) dl_description = "Vertex Color Bake Addon Description" # クラスの属性 # 以下の属性を設定できる # REGISTER : Operatorを情報ウィンドウに表示し、やり直しツールバーパネルをサポートする # UNDO : 元に戻すイベントをプッシュする(Operatorのやり直しに必要) # UNDO_GROUPED : Operatorの繰り返しインスタンスに対して単一の取り消しイベントをプッシュする # BLOCKING : 他の操作がマウスポインタ―を使用できないようにブロックする # MACRO : Operatorがマクロであるかどうかを確認するために使用する # GRAB_CURSOR : 継続的な操作が有効な場合にオペレーターがマウスポインターの動きを参照して、操作を有効にする # GRAB_CURSOR_X : マウスポインターのX軸の動きのみを参照する # GRAB_CURSOR_Y : マウスポインターのY軸の動きのみを参照する # PRESET : Operator設定を含むプリセットボタンを表示する # INTERNAL : 検索結果からOperatorを削除する # 参考URL:https://docs.blender.org/api/current/bpy.types.Operator.html#bpy.types.Operator.bl_options bl_options = {'REGISTER', 'UNDO'} # Operator実行時の処理 def execute(self, context): # カスタムプロパティから指定中のオブジェクトを取得する target_object = context.scene.holomon_vertex_color_bake.prop_objectslect # 指定中のオブジェクトを確認する if target_object == None: # オブジェクトが指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "Nothing : target object.") return {'CANCELLED'} # カスタムプロパティから指定中のテクスチャ名を取得する texture_name = context.scene.holomon_vertex_color_bake.prop_texturename # 指定中のテクスチャ名を確認する if texture_name == None: # テクスチャ名が指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "Nothing : texture name.") return {'CANCELLED'} # カスタムプロパティから指定中のテクスチャサイズを取得する texture_size = context.scene.holomon_vertex_color_bake.prop_texturesize # 指定中のテクスチャサイズを確認する if texture_size < 1: # 適切なテクスチャサイズが指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "Nothing : texture size.") return {'CANCELLED'} # カスタムプロパティから指定中のベイク余白を取得する bake_margin = context.scene.holomon_vertex_color_bake.prop_bakemargin # 指定中のテクスチャサイズを確認する if bake_margin < 0: # 適切なテクスチャサイズが指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "Nothing : bake margin.") return {'CANCELLED'} # 指定オブジェクトの頂点カラーを画像テクスチャにベイクする bake_vertexcolor_texture( arg_object=target_object, arg_texturename=texture_name, arg_texturesize=texture_size, arg_bakemargin=bake_margin ) return {'FINISHED'} # PropertyGroupクラスの作成 # 参考URL:https://docs.blender.org/api/current/bpy.types.PropertyGroup.html class HOLOMON_addon_vertex_color_bake_properties(PropertyGroup): # オブジェクト選択時のチェック関数を定義する def prop_object_select_poll(self, context, ): # メッシュオブジェクトのみ選択可能 if(context and context.type in ('MESH', )): return True return False # シーン上のパネルに表示するオブジェクト選択用のカスタムプロパティを定義する prop_objectslect: PointerProperty( name = "Select Object", # プロパティ名 type = bpy.types.Object, # タイプ description = "", # 説明文 poll = prop_object_select_poll, # チェック関数 ) # シーン上のパネルに表示するテクスチャ名指定用のカスタムプロパティを定義する prop_texturename: StringProperty( name="Texture Name", # プロパティ名 default="BakeTexture", # デフォルト値 maxlen=1024, # 最大文字列長 description="", # 説明文 ) # シーン上のパネルに表示するテクスチャサイズ指定用のカスタムプロパティを定義する prop_texturesize: IntProperty( name = "Texture Size", # プロパティ名 default=2048, # デフォルト値 description = "", # 説明文 ) # シーン上のパネルに表示するベイク余白用のカスタムプロパティを定義する prop_bakemargin: IntProperty( name = "Bake Margin", # プロパティ名 default=16, # デフォルト値 description = "", # 説明文 ) # 登録に関する処理 # 登録対象のクラス名 regist_classes = ( HOLOMON_PT_addon_vertex_color_bake, HOLOMON_OT_addon_vertex_color_bake, HOLOMON_addon_vertex_color_bake_properties, ) # 作成クラスと定義の登録メソッド def register(): # カスタムクラスを登録する for regist_cls in regist_classes: bpy.utils.register_class(regist_cls) # シーン情報にカスタムプロパティを登録する bpy.types.Scene.holomon_vertex_color_bake = PointerProperty(type=HOLOMON_addon_vertex_color_bake_properties) # 作成クラスと定義の登録解除メソッド def unregister(): # シーン情報のカスタムプロパティを削除する del bpy.types.Scene.holomon_vertex_color_bake # カスタムクラスを解除する for regist_cls in regist_classes: bpy.utils.unregister_class(regist_cls) # 指定オブジェクトの頂点カラーを画像テクスチャにベイクする def bake_vertexcolor_texture(arg_object:bpy.types.Object, arg_texturename:str="BakeTexture", arg_texturesize:int=2048, arg_bakemargin:int=0) -> bool: """指定オブジェクトの頂点カラーを画像テクスチャにベイクする Args: arg_object (bpy.types.Object): 指定オブジェクト arg_texturename (str, optional): 作成テクスチャ名. Defaults to "BakeTexture". arg_texturesize (int, optional): 作成テクスチャサイズ(px). Defaults to 2048. arg_bakemargin (int, optional): ベイク余白(px). Defaults to 0. Returns: bool: 実行正否 """ # 参照の保存用変数 name_mapping = {} # 追加するマテリアル名を定義する addmaterial_name = "ForBakeVertexColor" # 追加する画像ノード名を定義する texturenode_name = "ForBakeTextureNode" # UVマップが存在するか確認する check_uvlayer = get_uvlayer_active(arg_object=arg_object) if check_uvlayer == None: # UVマップが存在しない場合はスマートUV展開を実行する active_uvlayer = project_uv_smart(arg_object=arg_object) # 各レイヤーの取得を行う # ※ 頂点カラーやUVマップの更新は全てのレイヤーに影響して参照が変わるため # 必ず生成処理が全て完了した後に再取得を行う # 頂点カラーレイヤーを取得する active_vertexcolor = get_vertexcolor_active(arg_object=arg_object) if active_vertexcolor == None: # 頂点カラーの取得に失敗した場合は処理しない return False # UVマップレイヤーを取得する active_uvlayer = get_uvlayer_active(arg_object=arg_object) if active_uvlayer == None: # UVマップの取得に失敗した場合は処理しない return False # 指定オブジェクトの全マテリアルを削除する is_alldel = delete_material_all(arg_object=arg_object) # 新規テクスチャを作成して参照を取得する bake_image = make_new_image( arg_texturename=arg_texturename, arg_texturesize=arg_texturesize ) # 指定オブジェクトに頂点カラーとエミッションを使ったシンプルなマテリアルを作成する emission_mat = add_material_vertexemission( arg_object=arg_object, arg_vertexcolor=active_vertexcolor ) # 新規テクスチャを参照する画像ノードを追加する baketexture_node = add_node_image( arg_material=emission_mat, arg_image=bake_image ) # 指定の画像ノードを選択状態に設定する select_node_target( arg_material=emission_mat, arg_node=baketexture_node ) # 指定オブジェクトの「放射(Emission)」をベイクする bake_emission_simple( arg_object=arg_object, arg_bakemargin=arg_bakemargin, arg_GPUuse=True ) # 作成した頂点カラーマテリアルを削除する is_emitdel = delete_material_all(arg_object=arg_object) # 作成したテクスチャを参照するシンプルなBSDFマテリアルを作成する texture_mat = add_material_textureBSDF(arg_object=arg_object, arg_texture=bake_image) return True # レンダリング時に有効な頂点カラーレイヤーを取得する def get_vertexcolor_active(arg_object:bpy.types.Object) -> bpy.types.MeshLoopColorLayer: """レンダリング時に有効な頂点カラーレイヤーを取得する Args: arg_object (bpy.types.Object): 指定オブジェクト Returns: bpy.types.MeshLoopColorLayer: 有効な頂点カラーレイヤーの参照 """ # 指定オブジェクトがメッシュオブジェクトか確認する if arg_object.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return False # 対象オブジェクトのメッシュデータを取得する # メッシュデータ操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = arg_object.data # 頂点カラーレイヤーのリストを取得する # 頂点カラーレイヤーのリスト操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.LoopColors.html) vertexcolors = meshdata.vertex_colors # 変数の初期化 render_index = -1 # 頂点カラーレイヤーを走査する for index in range(0, len(vertexcolors)): # レンダリング時の有効無効をチェックする if vertexcolors[index].active_render == True: # レンダリング時に有効な頂点カラーレイヤーのインデックスを取得する render_index = index # 有効なインデックスが取得できたか確認する if render_index == -1: # 取得できなかった場合は空文字を返す return "" # レンダリング時に有効な頂点カラーレイヤーの参照を取得する # 頂点カラーレイヤー操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.MeshLoopColorLayer.html) active_vertexcolor = vertexcolors[render_index] return active_vertexcolor # レンダリング時に有効なUVマップレイヤーを取得する def get_uvlayer_active(arg_object:bpy.types.Object) -> bpy.types.MeshUVLoopLayer: """レンダリング時に有効なUVマップレイヤーを取得する Args: arg_object (bpy.types.Object): 指定オブジェクト Returns: bpy.types.MeshUVLoopLayer: 有効なUVマップレイヤーの参照 """ # 指定オブジェクトがメッシュオブジェクトか確認する if arg_object.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return False # 対象オブジェクトのメッシュデータを取得する # メッシュデータ操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = arg_object.data # UVマップレイヤーのリストを取得する # UVマップレイヤーのリスト操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html) uv_layers = meshdata.uv_layers # アクティブなUVマップを取得する # UVマップレイヤー操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html) active_uvlayer = uv_layers.active return active_uvlayer # スマートUV展開を実行する(デフォルト設定) def project_uv_smart(arg_object:bpy.types.Object) -> bpy.types.MeshUVLoopLayer: """スマートUV展開を実行する(デフォルト設定) Args: arg_object (bpy.types.Object): 指定オブジェクト Returns: bpy.types.MeshUVLoopLayer: 作成UVマップレイヤーの参照 """ # 不要なオブジェクトを選択しないように # 全てのオブジェクトを走査する for ob in bpy.context.scene.objects: # 非選択状態に設定する ob.select_set(False) # オブジェクトを選択状態にする arg_object.select_set(True) # 対象オブジェクトをアクティブに変更する bpy.context.view_layer.objects.active = arg_object # 編集モードに移行する bpy.ops.object.mode_set(mode='EDIT', toggle=False) # 頂点を全選択した状態とする bpy.ops.mesh.select_all(action='SELECT') # デフォルト設定のスマートUV展開を実行する # 角度制限:66,島の余白:0,エリアウェイト:0,アスペクト比の補正:True,UV境界に合わせる:True bpy.ops.uv.smart_project(angle_limit=66, island_margin=0, user_area_weight=0, use_aspect=True, stretch_to_bounds=True) # オブジェクトモードに移行する bpy.ops.object.mode_set(mode='OBJECT', toggle=False) # 対象オブジェクトに追加されたUVマップを取得する active_uvlayer = arg_object.data.uv_layers[-1] return active_uvlayer # 指定オブジェクトのマテリアルを全て削除する def delete_material_all(arg_object:bpy.types.Object) -> bool: """指定オブジェクトのマテリアルを全て削除する Args: arg_object (bpy.types.Object): 指定オブジェクト arg_materialname (str, optional): 作成マテリアル名. Defaults to "DefaultMaterial". Returns: bool: 実行正否 """ # 指定オブジェクトがメッシュオブジェクトか確認する if arg_object.type != 'MESH': # メッシュオブジェクトでない場合は処理しない return False # 対象オブジェクトのメッシュデータを取得する # メッシュデータ操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = arg_object.data # メッシュのマテリアルを全て削除する while len(meshdata.materials) > 0: # IDMaterial操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.IDMaterials.html) meshdata.materials.pop(index=-1) return True # 新規画像を作成する def make_new_image(arg_texturename:str="BakeTexture", arg_texturesize:int=2048) -> bpy.types.Image: """新規画像を作成する Args: arg_texturename (str, optional): 作成テクスチャ名. Defaults to "BakeTexture". arg_texturesize (int, optional): 作成テクスチャサイズ. Defaults to 2048. Returns: bpy.types.Image: 作成画像の参照 """ # 新規画像を作成する newimage = bpy.data.images.new( name=arg_texturename, width=arg_texturesize, height=arg_texturesize, alpha=True ) return newimage # 指定オブジェクトに頂点カラーとエミッションを使ったシンプルなマテリアルを作成する def add_material_vertexemission(arg_object:bpy.types.Object, arg_vertexcolor:bpy.types.MeshLoopColorLayer) -> bpy.types.Material: """指定オブジェクトに頂点カラーとエミッションを使ったシンプルなマテリアルを作成する Args: arg_object (bpy.types.Object): 指定オブジェクト arg_vertexcolor (bpy.types.MeshLoopColorLayer): 指定頂点カラーレイヤー Returns: bpy.types.Material: 作成マテリアルの参照 """ # 新規マテリアルを作成する new_material = bpy.data.materials.new("VertexColorMaterial") # メッシュデータの参照を取得する meshdata = arg_object.data # メッシュのマテリアルを追加する meshdata.materials.append(new_material) # 追加したマテリアルスロットを取得する add_matslot = arg_object.material_slots[-1] # ノードを使用する new_material.use_nodes = True # 新規マテリアルのノード参照を取得する mat_nodes = new_material.node_tree.nodes # マテリアル内の全ノードを走査する for delete_node in mat_nodes: # 一旦全てのノードを削除する mat_nodes.remove(delete_node) # 属性ノードを追加する attr_node = mat_nodes.new(type='ShaderNodeAttribute') # 属性ノードのアトリビュート名を頂点カラーレイヤー名に変更する attr_node.attribute_name = arg_vertexcolor.name # エミッションノードを追加する emit_node = mat_nodes.new(type='ShaderNodeEmission') # 出力ノードを追加する output_node = mat_nodes.new(type='ShaderNodeOutputMaterial') # ターゲットマテリアルのノードリンク参照を取得する mat_link = new_material.node_tree.links # 属性ノードのカラーと放射ノードのカラーを接続する mat_link.new(attr_node.outputs[0], emit_node.inputs[0]) # 放射ノードの放射と出力ノードのサーフェスを接続する mat_link.new(emit_node.outputs[0], output_node.inputs[0]) return new_material # 対象マテリアルに指定テクスチャを参照する画像ノードを追加する def add_node_image(arg_material:bpy.types.Material, arg_image:bpy.types.Image) -> bpy.types.Node: """対象マテリアルに指定テクスチャを参照する画像ノードを追加する Args: arg_material (bpy.types.Material): 対象マテリアル arg_image (bpy.types.Image): 指定テクスチャ Returns: bpy.types.Node: 作成ノードの参照 """ # ノード操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Node.html) # ターゲットマテリアルのノード参照を取得 mat_nodes = arg_material.node_tree.nodes # テクスチャノードの追加 texture_node = mat_nodes.new(type='ShaderNodeTexImage') # テクスチャノードに指定画像を設定する texture_node.image = arg_image return texture_node # 対象マテリアルの指定ノードのみを選択状態する def select_node_target(arg_material:bpy.types.Material, arg_node:bpy.types.Node): """対象マテリアルの指定ノードのみを選択状態する Args: arg_material (bpy.types.Material): 対象マテリアル arg_node (bpy.types.Node): 指定ノード """ # ノード操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Node.html) # ノードリスト操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Nodes.html) # ターゲットマテリアルのノード参照を取得 mat_nodes = arg_material.node_tree.nodes # 全てのノードの選択状態を解除する for mat_node in mat_nodes: # 選択状態を解除する mat_node.select = False # 指定ノードを選択状態にする arg_node.select = True # 指定ノードをアクティブにする mat_nodes.active = arg_node return # 指定オブジェクトの放射(Emmission)情報のみをベイクする def bake_emission_simple(arg_object:bpy.types.Object, arg_bakemargin:int=0, arg_GPUuse:bool=False): """指定オブジェクトのカラー情報のみをベイクする Args: arg_object (bpy.types.Object): 指定オブジェクト arg_bakemargin (int, optional): ベイク余白. Defaults to 0. arg_GPUuse (bool, optional): GPU利用指定. Defaults to False. """ # 全てのオブジェクトを非選択状態にする for obj in bpy.context.scene.objects: # 選択状態を解除する obj.select_set(False) # 指定オブジェクトを選択状態にする arg_object.select_set(True) # 指定オブジェクトをアクティブにする bpy.context.view_layer.objects.active = arg_object # レンダリングエンジンを CYCLES に切り替える bpy.context.scene.render.engine = 'CYCLES' # GPUの利用有無を確認する if arg_GPUuse == True: # 利用設定なら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 # 放射タイプのベイクを実行する # ベイクの種類 # ('COMBINED', 'AO', 'SHADOW', 'NORMAL', 'UV', 'ROUGHNESS', # 'EMIT', 'ENVIRONMENT', 'DIFFUSE', 'GLOSSY', 'TRANSMISSION') # (render.bake 以外の設定は引数で指定する必要あり) bpy.ops.object.bake(type='EMIT', margin=arg_bakemargin) return # 指定オブジェクトに指定テクスチャのシンプルなプリンシプルBSDFマテリアルを作成する def add_material_textureBSDF(arg_object:bpy.types.Object, arg_texture:bpy.types.Image) -> bpy.types.Material: """指定オブジェクトに指定テクスチャのシンプルなプリンシプルBSDFマテリアルを作成する Args: arg_object (bpy.types.Object): 指定オブジェクト arg_texture (bpy.types.Image): 指定テクスチャ Returns: bpy.types.Material: 作成マテリアルの参照 """ # 新規マテリアルを作成する new_material = bpy.data.materials.new("TextureMaterial") # メッシュデータの参照を取得する meshdata = arg_object.data # メッシュのマテリアルを追加する meshdata.materials.append(new_material) # 追加したマテリアルスロットを取得する add_matslot = arg_object.material_slots[-1] # ノードを使用する new_material.use_nodes = True # 新規マテリアルのノード参照を取得する mat_nodes = new_material.node_tree.nodes # マテリアル内の全ノードを走査する for delete_node in mat_nodes: # 一旦全てのノードを削除する mat_nodes.remove(delete_node) # テクスチャノードの追加 texture_node = mat_nodes.new(type='ShaderNodeTexImage') # テクスチャノードに新規画像を設定する texture_node.image = arg_texture # プリンシプルBSDFノードを追加する bsdf_node = mat_nodes.new(type='ShaderNodeBsdfPrincipled') # 出力ノードを追加する output_node = mat_nodes.new(type='ShaderNodeOutputMaterial') # ターゲットマテリアルのノードリンク参照を取得する mat_link = new_material.node_tree.links # テクスチャノードのカラーとプリンシプルBSDFノードのベースカラーを接続する mat_link.new(texture_node.outputs[0], bsdf_node.inputs[0]) # プリンシプルBSDFのシェーダ出力と出力ノードのサーフェスを接続する mat_link.new(bsdf_node.outputs[0], output_node.inputs[0]) return new_material # 実行時の処理 if __name__ == "__main__": # 作成クラスと定義を登録する register()
使い方
頂点カラーの色情報を持ったメッシュオブジェクトを用意します。
3Dビューのサイドバーから[HoloMon]->[Vertex Color Bake]を開いて以下の設定を行い、[VERTEX COLOR BAKE]を実行します。
Select Object:ベイクの実行対象オブジェクト Texture Name :作成テクスチャ名 Texture Size :作成テクスチャサイズ(指定辺長の正方形) Bake Margin :ベイク実行時の余白(px)
頂点カラーがテクスチャにベイクされ、カラーテクスチャが作成されます。
自動的にテクスチャを参照するプリンシプルBSDFノードのマテリアルが設定されます。
外部テクスチャを参照する3Dモデル形式での出力の際は、作成したテクスチャもファイル出力してください。