夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

BlenderでPythonを使用して頂点カラーを設定する

本日はBlenderPython枠です。

今回はPythonで頂点カラーを設定していきます。

〇頂点カラーとは?

3Dモデルは頂点とそれをつなぐ辺によって構成される面(メッシュ)で構成されています。

基本的に座標や法線、UVなどの各情報は頂点が持っています。

頂点カラーは頂点が持つことができる色情報を指します。

redhologerbera.hatenablog.com

頂点カラーを用いることで複数のマテリアルやテクスチャ無しにカラー表現することもできますが、一般的に頂点カラーの情報を使用して何かの処理をするという使われ方が行われています。

例えば、SubstancePainterでは頂点カラーでベイクを行うことができます。

これによってもともと複数のマテリアルで構成されていたオブジェクトを1つのマテリアルにまとめ、テクスチャを作成することができます。

Pythonを使用して頂点カラーを設定する

メッシュの頂点カラーにアクセスするためにはselected_object.data.vertex_colorsを用います。

具体的には以下のようなコードになります。

import bpy

# 選択中のメッシュを取得
selected_object = bpy.context.active_object

# 選択中のメッシュが存在し、タイプがメッシュであることを確認
if selected_object and selected_object.type == 'MESH':
    # 頂点カラーが存在しない場合、頂点カラーを作成
    if not selected_object.data.vertex_colors:
        bpy.ops.object.mode_set(mode='EDIT')
        bpy.ops.mesh.select_all(action='SELECT')
        bpy.ops.mesh.vertex_color_add()
        bpy.ops.object.mode_set(mode='OBJECT')
    
    # 頂点カラーのレイヤーを取得
    vertex_colors_layer = selected_object.data.vertex_colors.active.data

    # 各頂点に赤色をセット
    red_color = (1.0, 0.0, 0.0, 1.0)  # RGBA形式で赤色を指定
    for poly in selected_object.data.polygons:
        for loop_index in poly.loop_indices:
            # 頂点カラーのレイヤーが足りない場合、追加する
            while len(vertex_colors_layer) <= loop_index:
                vertex_colors_layer.append([0, 0, 0, 1])  # 新しい頂点カラーのレイヤーを作成
            
            vertex_colors_layer[loop_index].color = red_color

    print("頂点カラーが赤色にセットされました。")
else:
    print("選択中のオブジェクトがメッシュではありません。")

オブジェクトモードで実行することで上記の場合は一様に赤色の頂点カラーが設定されます。

頂点カラーは配列として格納されているため、レイヤー情報と思って扱うとエラーが起こりくいです。

本日は以上です。