2023年6月14日水曜日

BlenderのColorRampノードをBlenderPythonで遊ぶ

 Playing with Blender's ColorRamp node in BlenderPython


I played with Blender's ColorRamp node by getting its information with BlenderPython and generating a node set with BlenderPython. Operating ColorRamp has become fun.


BlenderのColorRampノードについて、その情報をBlenderPythonで取得したり、BlenderPythonでノードセットを生成したりして遊んでみました。ColorRampの操作が楽しくなってきました。

遊び 1 平面メッシュに干渉色カラーを塗るBlenderPythonスクリプト

2023.06.10記事「Blenderでカラーグラデーションを塗るPythonスクリプト」で、ChatGPTに「Blenderで新たな平面メッシュに赤~燈~黄~緑~青~藍~紫のカラーグラデーションを塗るPythonスクリプト」を作ってもらいました。

その回答に続けて、さらに次の質問をChatGPTにして回答を得ました。

【ChatGPT質問】

このBlenderPythonスクリプトを参考にして、Blenderで新たな平面メッシュに干渉色カラーのグラデーションを塗るスクリプトを教えてください。

【ChatGPT回答】

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

import bpy

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

bpy.ops.mesh.primitive_plane_add()

obj = bpy.context.object

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

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.0

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

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

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

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

ndvr.color_ramp.elements.new(position=1.0).color = 1, 0, 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説明】

このスクリプトは、干渉色カラーグラデーションを作成するために、いくつかのノードを追加し、カラーランプの要素を調整しています。干渉色カラーグラデーションは、赤、橙、黄、緑、青、紫の色相で構成されます。

新たな平面メッシュを作成し、その上に干渉色カラーグラデーションが適用されます。干渉色カラーグラデーションは、物体の位置に依存しないため、平面メッシュのサイズや形状に関係なく同じグラデーションが得られます。

このスクリプトを実行すると、新しい平面メッシュが作成され、その上に干渉色カラーグラデーションが塗られます。


干渉色に塗られた平面

やまだこーじさん開発の干渉色とはだいぶ趣が違いますが、ChatGPTなりに干渉色の事例を作ったことは楽しいできごとです。

関連して、次のような追加質問をしてみました。

【ChatGPT質問】

このスクリプトで表現した「干渉色」の定義や説明を教えてください。

【ChatGPT回答】

「干渉色」とは、物理的な干渉現象に基づいて生じる色のことを指します。光は波動の性質を持っており、波長や振動数の異なる光が干渉することで、特定の色の組み合わせが生じます。

干渉色は、光の波長や周波数によって変化し、視覚的な色の現象として観察されます。一般的に、光の干渉は2つの波が出会って相互作用する場合に起こります。

例えば、薄い膜の上を透過した光が反射して戻ってくる場合、波の干渉によって一部の波長の光が強められたり減衰したりすることがあります。この干渉によって生じる光の波長の組み合わせが、干渉色として観察されます。

具体的な例としては、オイルや水の薄い膜の上に光が反射して干渉色が現れる現象や、CDやDVDの表面の微細な凹凸が光の干渉によって虹色の光を生じる現象などがあります。

干渉色は一般的には虹色に似た色相を持ち、複数の色が連続的に変化するグラデーションを形成します。このスクリプトでは、赤、橙、黄、緑、青、紫の干渉色のグラデーションが平面メッシュに塗られるように設定されています。

…………………

ChatGPTとコミュニケーションが成り立ったことは楽しいことです。

遊び 2 ColorRampノードの情報取得スクリプト作成

遊び1でChatGPTに作ってもらった干渉色グラデーションのColorRampノードをテスト事例として、そのノードから詳細情報を取得するBlenderPythonスクリプトをChatGPTの支援を受けて作りました。

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

#選択されたカラーランプノードのcolor_mode,interpolation,各要素の番号,position,color(BlenderにおけるRGB表記、0.0-1.0の範囲で表示)をprintする

import bpy

# カラーランプノードを取得

selected_node = bpy.context.active_object.active_material.node_tree.nodes.active

# カラーモードを出力

color_mode = selected_node.color_ramp.color_mode

print("Color Mode:", color_mode)

# 補間方法を出力

interpolation = selected_node.color_ramp.interpolation

print("Interpolation:", interpolation)

# カラーランプの各要素の情報を出力

elements = selected_node.color_ramp.elements

for i, element in enumerate(elements):

    position = element.position

    color = element.color

    # BlenderにおけるRGB表記に変換

    color_blender = (

        color[0],

        color[1],

        color[2]

    )

    print(f"Element {i} - Position: {position}, Color: {color_blender}")

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


スクリプトを走らせた結果得られたColorRampノード情報

複雑で手の込んだColorRampノードをアナログで作成した場合、positionやcolor(RGB値、0.0-1.0の範囲)の数値は桁の多い少数点表示になりますからその記録をする上で、このBlenderPythonスクリプトがあると便利です。ColorRampをアペンドしなくても、数値でColorRampを再生できます。色をRGB値(0-255)表示と16進数表示のスクリプトも別に作成しました。

遊び 3 ColorRampノードセット生成スクリプト作成

遊び2で得られたColorRampノード情報をテスト事例として、ColorRampノードと関連ノードをセットで生成して、シェーダーエディター画面に配置するBlenderPythonスクリプトをChatGPTの支援を受けて作成しました。

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

#ColorRampノードセット(テクスチャ座標、マッピング、グラデーションテクスチャ、カラーランプ)の生成

import bpy

# 選択されたオブジェクトを取得

selected_obj = bpy.context.object

# オブジェクトに関連付けられたマテリアルを取得

material = selected_obj.active_material

# マテリアルが存在しない場合は新しいマテリアルを作成

if material is None:

    material = bpy.data.materials.new(name="interference_color")

    selected_obj.active_material = material

    material.use_nodes = True

    material.blend_method = "BLEND"

# テクスチャ座標設定

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

ndtc.location = -800, 350

# マッピング設定

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

ndmp.location = -630, 350

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

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

ndgr.location = -450, 350

# カラーランプノードの追加と設定

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

ndvr.location = -260, 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 = 1, 0, 0, 1

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

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

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

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

# ノード間のリンク設定

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

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

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

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


ColorRampノードセット生成スクリプトを走らせてセットを生成し、メッシュオブジェクトにリンクした様子


BlenderPythonスクリプトで生成したノードセット

このスクリプトがあれば、数値情報があれば、直ぐにColorRampノードを実戦投入できます。生成するノードセットはテクスチャ座標ノード、マッピングノード、グラデーションテクスチャノード、ColorRampノードです。

遊び 4 ColorRampノードのプロパティ画面でノードを拡大出来ることを知る

シェーダーエディター画面の中に通常のColorRampノードは拡大に限度があります。しかしシェーダーエディター画面右に生成できるColorRampノードのプロパティ画面ではColorRampをいくらでも拡大できます。多数のストップを配置する場合などに便利であることに気が付きました。


拡大したColorRampノードのプロパティ画面

感想

干渉色はやまだこーじさんが素晴らしいものを開発していますから、それを使わせていただくことにします。自分が学習している考古事象(考古学的地形、考古遺物など)を見やすくしたり、分析しやすくするのにふさわしいカラーグラデーションを開発して楽しむことにします。


0 件のコメント:

コメントを投稿