ラベル 干渉色塗色 の投稿を表示しています。 すべての投稿を表示
ラベル 干渉色塗色 の投稿を表示しています。 すべての投稿を表示

2024年4月28日日曜日

技術メモ BlenderPythonによるオブジェクトの干渉色塗色

 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ノードとのリンク

干渉色変換ツールを開発し、その情報を公開しているやまだこーじさんに感謝します。

なお、カラーランプを改変すれば、自由な配色セットによるオブジェクト塗色が可能となります。


2022年8月3日水曜日

等高線3Dモデルの干渉色塗色

 Interference color painting of contour 3D model


I played with the contour 3D model created with Blender by painting it in interference colors with Koji Yamada's development tool. In this play, all 3D models can be painted with interference color stripes, so the result is the same as drawing detailed contour lines, and I realized that it can be used as a tool for observing 3D models.


Blenderで作成した等高線3Dモデルをやまだこーじさん開発ツールで干渉色に塗色して遊びました。この遊びの中で、全ての3Dモデルを干渉色縞模様で塗色できますから、精細な等高線を描いたのと同じ結果になり、3Dモデルの観察ツールとして使えることに気が付きました。

1 等高線3Dモデルの干渉色塗色

Blenderで等高線から作成した3Dモデルの干渉色塗色


紙に鉛筆で描いた等高線図

干渉色塗色は干渉色変換ツール(やまだこーじさん公開)によります。


3Dモデルの動画

2 干渉色塗色方法

次のステップで干渉色塗色を行いました。今はこのような迂遠な方法しか気が付きませんが、もっと効率的方法があるに違いないと考えています。

1 Blenderで紙等高線を3Dモデルにする。Wabefront(.obj)ファイルをエクスポートする。

2 Wabefront(.obj)ファイルを3DF Zephyr Liteにロードする。「メッシュ」としての読み込み。

3 3DF Zephyr Liteでフィルター→カラーを更新→高さによる→カラーマップGreys(反転)→OK 高さに応じて白から黒へのグラデーションが塗色される。


高さを白黒グラデーションで表現した3DF Zephyr Lite画面

4 3DF Zephyr LiteからそのメッシュをSketchfabに投稿する。

3DF Zephyr Lite投稿画面(作業の一環としての投稿であり、見てもらうための投稿ではありません。)


Sketchfab投稿画面

5 Sketchfabからその投稿をgltfファイルでダウンロードする。

6 Blenderにgltfファイルをインポートする。


gltfファイルをインポートしたBlender画面

7 Blenderでgltfファイルからテクスチャ画像(白と黒のグラデーション)を取り出す(※)とともにWabefront(.obj)ファイルとしてエクスポートする。


gltfファイルから取り出したテクスチャ画像

8 テクスチャ画像をやまだこーじさん開発「干渉色変換ツール」に投入して干渉色テクスチャ画像を作成する。


干渉色変換ツール作業画面

9 7のWabefront(.obj)ファイルのmtlファイルを編集して干渉色テクスチャ画像が3Dモデルに反映するようにする。

※ 7の詳細ステップ

7-1 UV展開する。

7-2 マテリアル→ノードを使用。

7-3 マテリアル下のカラーの横の丸を押して、出てくる画面から画像テクスチャを選択→新規をクリックし名称を付ける。

7-4 レンダープロパティ→レンダーエンジンcyclesに変更→ベイクでベイクをクリック(画像が生まれる)

7-5 texture paint→画像→保存(テクスチャ画像が外に保存される。)

7-6 Wabefront(.obj)ファイルをエクスポート。

3 干渉色繰り返し回数について

やまだこーじさん開発「干渉色変換ツール」では干渉色繰返回数を任意の数で設定できます。また、位相も任意に設定できます。とても高機能で素晴らしい変換ツールです。


干渉色繰返回数の違い

4 感想

やまだこーじさん開発「干渉色変換ツール」により3Dモデルに干渉色縞模様を自由に付けることが可能です。これにより、考古遺構(竪穴住居、土坑など)3Dモデルについて、干渉色縞模様を塗色することによりその高度分布を詳しく観察することが可能となります。干渉色変換ツールが3Dモデル観察ツールとして活用できる可能性があります。