ラベル 自作 の投稿を表示しています。 すべての投稿を表示
ラベル 自作 の投稿を表示しています。 すべての投稿を表示

2026年7月8日水曜日

自然言語によるBlenderマテリアル設定 自作Blenderアドオンの使い勝手 その3

 Configuring Blender Materials via Natural Language: Usability of a Custom Blender Add-on (Part 3)


I tested a custom Blender add-on that allows for material configuration using natural language. By using natural language, it is possible to construct complex node setups and create materials suitable for practical use.


自作Blenderアドオンについて、自然言語によるマテリアル設定をテストしました。自然言語により、複雑なノードを組んで、実用レベルのマテリアル設定ができます。

この記事は2026.07.06記事「BlenderアドオンBlenderChatGPTUI版の使い勝手 その2」の続きです。

1 金属マテリアル

プロンプト:スザンヌにノイズテクスチャーとカラーランプを組み合わせて、傷のある金属マテリアルを作ってください。

ChatGPTの作業方針:新規作業として、シーンを初期化してスザンヌを追加し、Noise Texture と ColorRamp を複数組み合わせた傷付き金属マテリアルをノードで作成します。ノイズを細長くマッピングして、表面の擦り傷っぽい粗さ・色ムラ・バンプを表現します。


金属マテリアル設定結果

2 レンガ柄

プロンプト:スザンヌに古びたレンガ柄のシェーダーグラフを構築してください。

ChatGPTの作業方針:新規作業として、スザンヌを作成し、手続き型のBrick Texture・Noise・ColorRamp・Bumpを組み合わせた「古びたレンガ柄」マテリアルを構築します。シーン確認用にカメラ、ライト、床も追加します。


レンガ柄マテリアル設定結果

3 金属干渉色

プロンプト:スザンヌに虹色の金属干渉色のマテリアルをつくってください。

ChatGPTの作業方針:スザンヌを新規作成し、Layer Weightを使った視線角依存の虹色ColorRampをPrincipled BSDFへ接続して、金属・低ラフネス・イリデッセンス設定の干渉色マテリアルを作成します。照明・カメラ・床も最小限セットアップします。


金属干渉色マテリアル設定結果

4 デニム布

プロンプト:スザンヌに紺色の古びてほころびのあるデニム布のマテリアルを作ってください。

ChatGPTの作業方針:新規作業として、Blender標準のスザンヌを作成し、紺色の古びたデニム布風マテリアルを割り当てます。ノイズ・波状テクスチャによる織り目と凹凸、色あせた面、裂け目風の暗い面、さらに細いカーブでほころび糸を追加して表現します。


デニム布マテリアル設定結果

5 メモ

自然言語で指示したマテリアルが複雑なノードで設定されていて、ノードをいじれば自分の好みに合わせて使えます。十分に実用レベルであると言えます。


2025年5月12日月曜日

遺物データベースの3D空間表示用Blenderアドオン自作

 I made a Blender add-on for displaying relic databases in 3D space.


I made an add-on for a database of relics with 3D coordinates that displays relics by classification in the Blender3D viewport. It feels like the database itself is imported into Blender, which is more convenient than importing data using BlenderPython scripts.


3D座標付遺物データベースについて、その分類毎に遺物をBlender3Dビューポートに表示するアドオンを自作しました。データベースそのものをBlenderに取り込んだ感覚になり、BlenderPythonスクリプトを使ったデータ取り込みより便利です。

1 遺物データベースの3D空間表示用Blenderアドオン Artifact Class Importer


遺物データベースの3D空間表示用Blenderアドオン Artifact Class Importer の説明

・ID、XYZ座標、分類から構成される5列のcsvファイルを読み込みます。

・ブラウザからcsvファイルを選択できます。

・遺物IDを名称とするオブジェクト(5㎝×5㎝×5㎝立方体)が3D空間に生成され、アウトライナーの特設コレクションに格納されます。

・全て表示および14分類のボタンにより、それぞれの分類毎にオブジェクトが3D空間に配置されます。


アドオンのパネル画面


アドオンのプロパティ


アドオンファイルの記述

2 ボタン別表示の様子


土器・土製品


石器・石


貝製品


骨・歯

3 感想

Blenderにデータベース情報を格納する能力があることを実感しました。

アドオン作成はChatGPTの支援を活用して、数回の修正を繰り返して実現しました。その途中で、本当にデータベース情報を格納できるのだろうかと疑問になり、ChatGPTに次の質問をしたほどです。

今後アドオンパネルを有効活用することにより、データベースソフト(postgreSQLなど)ではなく、Blenderで直接分析して、即3D空間表示するという新しい展望が開きました。

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

(この記事のアドオンの元となった別アドオンでのやりとりです。)

●私

再度試す前に、教えてください。今回読み込むcsvファイルにはIDと座標以外のデータベース情報が含まれています。その情報をBlenderが受け取り内部に格納することができると考えて間違いないか確認したいです。

●ChatGPT

はい、その認識で問題ありません。

Blender のオブジェクトには “カスタムプロパティ” として任意のキー/値ペアを内部に保持できます。今回のアドオンでも、以下のようにして

obj["class"] = class_v

obj["size"]  = size_v

obj["color"] = color_v

と書くことで class・size・color をオブジェクト内に格納していますが、CSV の他の列(例えば「発見年」や「遺跡名」など)があれば、同様に

for key, val in row.items():

    if key not in ("ID", "X", "Y", "Z"):

        obj[key] = val

とすれば、すべてのデータベース情報を obj["発見年"]、obj["遺跡名"] として取り込めます。

取り込んだプロパティは Python コンソールから bpy.data.objects["ID名"]["発見年"] のようにアクセスできますし、プロパティパネルに表示させることも可能です。

──つまり、ID/座標以外の列もカスタムプロパティとして完全に保持できます。追加で取り込みたいフィールドがあれば教えてください。

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


2025年4月27日日曜日

3D座標付き遺物リストのプロット用Blenderアドオン自作

 I made a Blender addon for plotting a list of relics with 3D coordinates


I made a Blender addon that plots a list of relics with 3D coordinates in Blender3D space. Until now I've been doing this with BlenderPython, but it's much more convenient to make it an addon. I was able to create the addon quickly with ChatGPT support.


3D座標付き遺物リストをBlender3D空間にプロットするBlenderアドオンを自作しました。これまではBlenderPythonで行ってきましたが、アドオンにした方がはるかに便利です。アドオン作成はChatGPT支援で直ぐにできました。

1 3D座標付き遺物リストのプロット用Blenderアドオン CSV Tools


3D座標付き遺物リストのプロット用Blenderアドオンの機能

csvファイルは単純に次の形式としました。

ID,X,Y,Z,TYPE

1,0,0,0,a

2,2,3,1,b

3,5,-2,4,c

…

csvファイルを選択できるようにしたので、便利です。

ID名(遺物名)のオブジェクトを作成し、TYPE名のコレクションに格納するので、多数遺物の扱いがしやすくなっています。

オブジェクトは0.05m×0.05m×0.05mのCUBEとして設定してあります。

アドオンづくりの楽しみという観点から言えば、色塗りを付加したり、オブジェクトの大きさや形状を変えたりといろいろ工夫はできるのですが、それらの機能を付加すると、自分の作業ではかえって煩雑になるので、それらからは試したうえで、撤退しました。

プロットしたものをgeometry nodesで凝った装飾を加える方が手軽で、自由で、効率的です。最初にプロットしたものに対して非破壊的にできます。

このアドオン作成はChatGPTの支援を受けました。

2 参考 自作アドオンのPythonスクリプト

以下のスクリプトをテキストファイルにして、拡張子をtxtからpyに変更するとPythonスクリプトになります。そのPythonスクリプトをBlenderアドオンとして読み込むと、アドオンCSV Toolsが使えるようになります。

bl_info = {
    "name": "CSVからCUBE配置ツール",
    "author": "ChatGPTアシスト",
    "version": (1, 1),
    "blender": (3, 0, 0),
    "location": "3Dビュー > サイドバー > CSV Tools",
    "description": "CSVファイルの座標にCUBEを配置し、TYPEごとにコレクションに整理するツール (ファイル選択対応)",
    "category": "Object",
}

import bpy
import csv
from bpy.props import StringProperty
from bpy_extras.io_utils import ImportHelper
from bpy.types import Operator, Panel

# --- CSVからCUBEを配置するメイン処理 ---
def get_or_create_collection(name):
    if name in bpy.data.collections:
        return bpy.data.collections[name]
    else:
        new_collection = bpy.data.collections.new(name)
        bpy.context.scene.collection.children.link(new_collection)
        return new_collection

def create_cubes_from_csv(csv_file):
    with open(csv_file, newline='', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            x = float(row['X'])
            y = float(row['Y'])
            z = float(row['Z'])
            type_name = row['TYPE']
            
            # Cube作成
            bpy.ops.mesh.primitive_cube_add(size=1, location=(x, y, z))
            obj = bpy.context.active_object
            obj.scale = (0.05, 0.05, 0.05)
            obj.name = f"Artifact_{row['ID']}"

            # 適切なコレクションに移動
            collection = get_or_create_collection(type_name)
            collection.objects.link(obj)
            bpy.context.scene.collection.objects.unlink(obj)

# --- オペレータークラス ---
class OBJECT_OT_import_csv_create_cubes(Operator, ImportHelper):
    bl_idname = "object.import_csv_create_cubes"
    bl_label = "CSVを読み込んでCUBEを配置"
    bl_options = {'REGISTER', 'UNDO'}

    filename_ext = ".csv"
    filter_glob: StringProperty(
        default="*.csv",
        options={'HIDDEN'},
    )

    def execute(self, context):
        create_cubes_from_csv(self.filepath)
        return {'FINISHED'}

# --- パネルクラス ---
class VIEW3D_PT_csv_tools(Panel):
    bl_label = "CSV Tools"
    bl_idname = "VIEW3D_PT_csv_tools"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'CSV Tools'

    def draw(self, context):
        layout = self.layout
        layout.operator(OBJECT_OT_import_csv_create_cubes.bl_idname, text="CSVファイルを選択して配置")

# --- 登録処理 ---
classes = (
    OBJECT_OT_import_csv_create_cubes,
    VIEW3D_PT_csv_tools,
)

def register():
    for cls in classes:
        bpy.utils.register_class(cls)

def unregister():
    for cls in reversed(classes):
        bpy.utils.unregister_class(cls)

if __name__ == "__main__":
    register()