Technical memo
Interference coloring of objects with BlenderPython
I created a BlenderPython script with the help of ChatGPT that can paint selected objects with interference colors in Blender and make adjustments. The interference color scheme was developed by Koji Yamada.
Blenderで、選択したオブジェクトを干渉色に塗り、調整ができるBlenderPythonスクリプトをChatGPT支援により作成しました。干渉色配色はやまだこーじさん開発によるものです。
1 オブジェクトの例
次のオブジェクト(フォトグラメトリで作成した土偶3Dモデル)を例に説明します。
オブジェクト
オブジェクトのノード
以下、このオブジェクトに干渉色を塗色する手順をメモします。
2 オブジェクトのテクスチャ画像ノードを外す
オブジェクトのテクスチャ画像ノードをプリンシプルBSDFから外します。オブジェクトを選択します。
オブジェクトの様子
オブジェクトのノード
2 BlenderPythonスクリプト「干渉色ノード生成」をテキストエディターに読み込み、スクリプトを実行します。
BlenderPythonスクリプト「干渉色ノード生成」
import bpy
# 選択されたオブジェクトのアクティブなマテリアルを取得
obj = bpy.context.object
material = obj.active_material
nodes = material.node_tree.nodes
# テクスチャ座標設定
ndtc = nodes.new("ShaderNodeTexCoord")
ndtc.location = -1140, 350
# マッピング設定
ndmp = nodes.new("ShaderNodeMapping")
ndmp.location = -970, 350
# 波テクスチャ設定
ndtw = nodes.new("ShaderNodeTexWave")
ndtw.location = -800, 350
# グラデーションテクスチャ設定
ndgr = nodes.new("ShaderNodeTexGradient")
ndgr.location = -630, 350
# カラーランプノードの追加と設定
ndvr = nodes.new("ShaderNodeValToRGB")
ndvr.location = -450, 350
ndvr.color_ramp.color_mode = "RGB"
ndvr.color_ramp.interpolation = "LINEAR"
# やまだこーじさん開発干渉色カラーグラデーションの設定
ndvr.color_ramp.elements[0].position = 0.0
ndvr.color_ramp.elements[0].color = 0.949,0.996,0.984,1.000
ndvr.color_ramp.elements.new(position=0.042).color = 1.000,0.965,0.784,1.000
ndvr.color_ramp.elements.new(position=0.083).color = 0.961,0.784,0.369,1.000
ndvr.color_ramp.elements.new(position=0.125).color = 0.796,0.455,0.020,1.000
ndvr.color_ramp.elements.new(position=0.167).color = 0.490,0.000,0.627,1.000
ndvr.color_ramp.elements.new(position=0.208).color = 0.000,0.408,0.925,1.000
ndvr.color_ramp.elements.new(position=0.250).color = 0.000,0.757,1.000,1.000
ndvr.color_ramp.elements.new(position=0.292).color = 0.525,0.961,0.871,1.000
ndvr.color_ramp.elements.new(position=0.333).color = 0.863,1.000,0.522,1.000
ndvr.color_ramp.elements.new(position=0.375).color = 1.000,0.886,0.000,1.000
ndvr.color_ramp.elements.new(position=0.417).color = 1.000,0.620,0.482,1.000
ndvr.color_ramp.elements.new(position=0.458).color = 0.945,0.220,0.835,1.000
ndvr.color_ramp.elements.new(position=0.500).color = 0.604,0.259,0.984,1.000
ndvr.color_ramp.elements.new(position=0.542).color = 0.000,0.639,0.929,1.000
ndvr.color_ramp.elements.new(position=0.583).color = 0.000,0.882,0.694,1.000
ndvr.color_ramp.elements.new(position=0.625).color = 0.306,0.976,0.373,1.000
ndvr.color_ramp.elements.new(position=0.667).color = 0.839,0.925,0.412,1.000
ndvr.color_ramp.elements.new(position=0.708).color = 1.000,0.749,0.718,1.000
ndvr.color_ramp.elements.new(position=0.750).color = 1.000,0.498,0.902,1.000
ndvr.color_ramp.elements.new(position=0.792).color = 0.957,0.380,0.922,1.000
ndvr.color_ramp.elements.new(position=0.833).color = 0.616,0.561,0.788,1.000
ndvr.color_ramp.elements.new(position=0.875).color = 0.000,0.769,0.584,1.000
ndvr.color_ramp.elements.new(position=0.917).color = 0.000,0.890,0.510,1.000
ndvr.color_ramp.elements.new(position=0.958).color = 0.420,0.902,0.659,1.000
ndvr.color_ramp.elements.new(position=1.000).color = 0.812,0.820,0.816,1.000
# ガンマ設定
ndgm = nodes.new("ShaderNodeGamma")
ndgm.inputs[1].default_value = 2.2 # ガンマ値を設定
ndgm.location = -180, 350
# ノード間のリンク設定
material.node_tree.links.new(ndtc.outputs[0], ndmp.inputs[0])
material.node_tree.links.new(ndmp.outputs[0], ndtw.inputs[0])
material.node_tree.links.new(ndtw.outputs[0], ndgr.inputs[0])
material.node_tree.links.new(ndgr.outputs[0], ndvr.inputs[0])
material.node_tree.links.new(ndvr.outputs[0], ndgm.inputs[0])
# ガンマ設定ノード(ndgm)をプリンシパルBSDFにリンクする
# アクティブなマテリアルのプリンシパルBSDFノードを取得
principled_bsdf = None
for node in nodes:
if node.type == 'BSDF_PRINCIPLED':
principled_bsdf = node
break
# プリンシパルBSDFノードが見つかった場合にのみリンクを作成
if principled_bsdf:
material.node_tree.links.new(ndgm.outputs[0], principled_bsdf.inputs[0])
else:
print("Principled BSDF node not found in material.")
3 オブジェクトが干渉色で塗色される
オブジェクトが干渉色で塗色されます。
オブジェクトの様子
オブジェクトのノード
ノードは左からテクスチャ座標、マッピング、波テクスチャ、グラデーション、カラーランプ、ガンマが生成し、プリンシブルBSDFにリンクします。
マッピングと波テクスチャはデフォルト設定になっていますので、干渉色塗色は望むような塗色になっていない可能性が高いので、調整が必要です。
マッピングと波テクスチャによる調整項目
カラーランプはやまだこーじさん開発干渉色の設定になっています。
干渉色設定のカラーランプ
ガンマはRGBのガンマ補正値2.2が設定されています。これは、BlenderのRGBはガンマ補正がされていないためです。ちなみに、ガンマ補正値に2.2より大きな数を入力すると全体が濃い色に小さな数を入力すると薄い色になります。
4 「マッピング 回転」の調整
「マッピング 回転」でYに90°を入力した様子
「マッピング 回転」でYに90°を入力した様子(上から)
この事例では「マッピング 回転」にY:90°を入力し、私が望むようなカラーランプ軸を設定しました。
5 「波テクスチャ スケール」の調整
「波テクスチャ スケール」の値に3を入力した様子
「波テクスチャ スケール」のデフォルト値5を3に変更してみました。
「波テクスチャ スケール」の値は干渉色セットの繰り返し回数の係数です。
6 「波テクスチャ 位相オフセット」の調整
「波テクスチャ 位相オフセット」の値に0.2を入力した様子
「波テクスチャ 位相オフセット」のデフォルト値0を0.2に変更してみました。
「波テクスチャ 位相オフセット」の値は干渉色セットの始まる位置をずらす係数です。
7 感想メモ
やまだこーじさん開発の干渉色変換ツール機能に相当する機能を、今回Blenderで実現できたと考えます。
干渉色カラーランプの原型は2023.06.17記事「干渉色生成BlenderPythonスクリプトを作成して干渉色を楽しむ」で作成しましたが、今回新たに次の工夫を行いました。
・干渉色のガンマ補正
・「マッピング 回転」によるカラーランプ軸設定
・「波テクスチャ スケール」による干渉色セット繰り返し回数設定
・「波テクスチャ 位相オフセット」による干渉色セット始点設定
・作成ノード群とプリンシプルBSDFノードとのリンク
干渉色変換ツールを開発し、その情報を公開しているやまだこーじさんに感謝します。
なお、カラーランプを改変すれば、自由な配色セットによるオブジェクト塗色が可能となります。