2023年6月10日土曜日

Blenderでカラーグラデーションを塗るPythonスクリプト

 Python script to paint color gradient in Blender


As part of learning BlenderPython, I created a Python script that paints a color gradient. For me, this activity is a follow-up activity, but I think I can expect further development and application in the future.


BlenderPython学習の一環としてカラーグラデーションを塗るPythonスクリプトを作成しました。見よう見まねの活動ですが、今後発展応用が期待できそうです。

1 平面メッシュを生成してそれにカラーグラデーションを塗るBlenderPythonスクリプト

……………………………………………………………………

# 平面メッシュにノードを設定してカラーグラデーションを塗る

# bpyのインポート

import bpy

# 平面メッシュ生成とマテリアル設定、ノードを使用、ブレンドモードをアルファブレンドに設定

bpy.ops.mesh.primitive_plane_add()

obj = bpy.context.object

mat = bpy.data.materials.new(name="rainbow")

obj.active_material = mat

mat.use_nodes = True

mat.blend_method = "BLEND"

# テクスチャ座標設定

ndtc = mat.node_tree.nodes.new("ShaderNodeTexCoord")

ndtc.location = -800, 250

# マッピング設定

ndmp = mat.node_tree.nodes.new("ShaderNodeMapping")

ndmp.location = -630, 250

# グラデーションテクスチャ設定

ndgr = mat.node_tree.nodes.new("ShaderNodeTexGradient")

ndgr.location = -450, 250

# カラーランプ設定

ndvr = mat.node_tree.nodes.new("ShaderNodeValToRGB")

ndvr.location = -260, 250

ndvr.color_ramp.color_mode = "RGB"

ndvr.color_ramp.interpolation = "LINEAR"

ndvr.color_ramp.elements[0].position = 0.239

ndvr.color_ramp.elements[0].color = 1, 0, 0, 1

p1 = ndvr.color_ramp.elements.new(position=0.565)

p1.color = 0, 1, 0, 1

ndvr.color_ramp.elements[2].position = 0.792

ndvr.color_ramp.elements[2].color = 0.04, 0.015, 1, 1

# プリンシプルBSDF設定

ndpb = mat.node_tree.nodes["Principled BSDF"]

ndpb.inputs[0].default_value = 0, 0, 0, 1

ndpb.inputs[7].default_value = 0

ndpb.inputs[9].default_value = 1

ndpb.inputs[17].default_value = 0

ndpb.inputs[18].default_value = 1

# ノード間のリンク設定

mat.node_tree.links.new(ndtc.outputs[0], ndmp.inputs[0])

mat.node_tree.links.new(ndmp.outputs[0], ndgr.inputs[0])

mat.node_tree.links.new(ndgr.outputs[0], ndvr.inputs[0])

mat.node_tree.links.new(ndvr.outputs[0], ndpb.inputs[0])


……………………………………………………………………


Blender画面(Scriptingにこのスクリプトをコピーして走らせた結果)

2 感想

2-1 感想 1

ノード設定をPythonスクリプトで書く方法の基本を理解しましたので、カラーグラデーションに限らずマテリアルやテクスチャ設定を伴うメッシュオブジェクトをPythonスクリプトで記述できるようになると思います。従って、逆にPythonスクリプトを使って効率的に特定のマテリアルやテクスチャ設定を伴うメッシュオブジェクト生成が出来るようになります。

2-2 感想 2

やまだこーじさんが開発した干渉色表現をカラーランプで行い、それをPythonスクリプトで記述すれば、それを使ってPythonスクリプトでメッシュオブジェトに干渉色を塗ることが出来るようになります。ガリー侵食地形面など考古的地形面とか遺物とかに干渉色を塗ることにより、地形や遺物の形態的特徴を効果的に表現できることが可能になります

3 追記

1で作成したBlenderPythonスクリプトを種に、虹色7色(赤~燈~黄~緑~青~藍~紫)のカラーグラデーションで平面メッシュを塗るPythonスクリプトをChatGPTに作ってもらいました。適切なスクリプトができました。

この質問と回答から、カラーランプの細かい作業を手作業でしなくても、Pythonスクリプトを使って質問することで、その面倒な作業をChatGPTに代行させることが可能であると確認しました。

……………………………………………………………………

【ChatGPT質問】

次のBlenderPythonスクリプトはBlenderで新たな平面メッシュを生成して、それにノードを設定することにより、赤~緑~青のカラーグラデーションを塗るものです。

このスクリプトを参考にして、新たな平面メッシュに赤(1,0,0,1)~燈(1,0.5,0,1)~黄(1,1,0,1)~緑(0,1,0,1)~青(0,0,1,1)~藍(0.5,0,1,1)~紫(1,0,0.5,1)をカラーグラデーションで塗るPythonスクリプトを教えてください。

……………………………………………………………………

# 平面メッシュにノードを設定してカラーグラデーションを塗る

# bpyのインポート

import bpy

# 平面メッシュ生成とマテリアル設定、ノードを使用、ブレンドモードをアルファブレンドに設定

bpy.ops.mesh.primitive_plane_add()

obj = bpy.context.object

mat = bpy.data.materials.new(name="rainbow")

obj.active_material = mat

mat.use_nodes = True

mat.blend_method = "BLEND"

# テクスチャ座標設定

ndtc = mat.node_tree.nodes.new("ShaderNodeTexCoord")

ndtc.location = -800, 250

# マッピング設定

ndmp = mat.node_tree.nodes.new("ShaderNodeMapping")

ndmp.location = -630, 250

# グラデーションテクスチャ設定

ndgr = mat.node_tree.nodes.new("ShaderNodeTexGradient")

ndgr.location = -450, 250

# カラーランプ設定

ndvr = mat.node_tree.nodes.new("ShaderNodeValToRGB")

ndvr.location = -260, 250

ndvr.color_ramp.color_mode = "RGB"

ndvr.color_ramp.interpolation = "LINEAR"

ndvr.color_ramp.elements[0].position = 0.239

ndvr.color_ramp.elements[0].color = 1, 0, 0, 1

p1 = ndvr.color_ramp.elements.new(position=0.565)

p1.color = 0, 1, 0, 1

ndvr.color_ramp.elements[2].position = 0.792

ndvr.color_ramp.elements[2].color = 0.04, 0.015, 1, 1

# プリンシプルBSDF設定

ndpb = mat.node_tree.nodes["Principled BSDF"]

ndpb.inputs[0].default_value = 0, 0, 0, 1

ndpb.inputs[7].default_value = 0

ndpb.inputs[9].default_value = 1

ndpb.inputs[17].default_value = 0

ndpb.inputs[18].default_value = 1

# ノード間のリンク設定

mat.node_tree.links.new(ndtc.outputs[0], ndmp.inputs[0])

mat.node_tree.links.new(ndmp.outputs[0], ndgr.inputs[0])

mat.node_tree.links.new(ndgr.outputs[0], ndvr.inputs[0])

mat.node_tree.links.new(ndvr.outputs[0], ndpb.inputs[0])

……………………………………………………………………

【ChatGPT回答】

以下は、Blenderで新たな平面メッシュに赤~燈~黄~緑~青~藍~紫のカラーグラデーションを塗るPythonスクリプトの例です。

……………………………………………………………………

# bpyのインポート

import bpy

# 平面メッシュ生成とマテリアル設定、ノードを使用、ブレンドモードをアルファブレンドに設定

bpy.ops.mesh.primitive_plane_add()

obj = bpy.context.object

mat = bpy.data.materials.new(name="rainbow")

obj.active_material = mat

mat.use_nodes = True

mat.blend_method = "BLEND"

# テクスチャ座標設定

ndtc = mat.node_tree.nodes.new("ShaderNodeTexCoord")

ndtc.location = -800, 250

# マッピング設定

ndmp = mat.node_tree.nodes.new("ShaderNodeMapping")

ndmp.location = -630, 250

# グラデーションテクスチャ設定

ndgr = mat.node_tree.nodes.new("ShaderNodeTexGradient")

ndgr.location = -450, 250

# カラーランプ設定

ndvr = mat.node_tree.nodes.new("ShaderNodeValToRGB")

ndvr.location = -260, 250

ndvr.color_ramp.color_mode = "RGB"

ndvr.color_ramp.interpolation = "LINEAR"

# 赤~燈~黄~緑~青~藍~紫のカラーグラデーションを設定

ndvr.color_ramp.elements[0].position = 0.143

ndvr.color_ramp.elements[0].color = 1, 0, 0, 1

ndvr.color_ramp.elements.new(position=0.286).color = 1, 0.5, 0, 1

ndvr.color_ramp.elements.new(position=0.429).color = 1, 1, 0, 1

ndvr.color_ramp.elements.new(position=0.571).color = 0, 1, 0, 1

ndvr.color_ramp.elements.new(position=0.714).color = 0, 0, 1, 1

ndvr.color_ramp.elements.new(position=0.857).color = 0.5, 0, 1, 1

ndvr.color_ramp.elements.new(position=1).color = 1, 0, 0.5, 1

# プリンシプルBSDF設定

ndpb = mat.node_tree.nodes["Principled BSDF"]

ndpb.inputs[0].default_value = 0, 0, 0, 1

ndpb.inputs[7].default_value = 0

ndpb.inputs[9].default_value = 1

ndpb.inputs[17].default_value = 0

ndpb.inputs[18].default_value = 1

# ノード間のリンク設定

mat.node_tree.links.new(ndtc.outputs[0], ndmp.inputs[0])

mat.node_tree.links.new(ndmp.outputs[0], ndgr.inputs[0])

mat.node_tree.links.new(ndgr.outputs[0], ndvr.inputs[0])

mat.node_tree.links.new(ndvr.outputs[0], ndpb.inputs[0])

……………………………………………………………………

このスクリプトでは、カラーランプの要素のposition(位置)とcolor(色)を調整して、赤~燈~黄~緑~青~藍~紫のカラーグラデーションを作成しています。

……………………………………………………………………


ChatGPT回答スクリプトを走らせて得られたBlender画面


0 件のコメント:

コメントを投稿