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

2026年8月8日土曜日

Blender内部での線分自動トレースに成功

 Successfully Implemented Automatic Line Tracing Within Blender


I have successfully implemented automatic line tracing within Blender. After numerous attempts and just as I was on the verge of giving up—thinking it might not be possible after all—I finally succeeded. Now, simply by preparing the cross-sectional shape of the earthenware as a template, I can create a base 3D model at any time.


Blender内部での線分自動トレースに成功しました。いろいろ試みて、やっぱりダメかと諦めかけた最後の最後で成功しました。これで土器断面形状を型紙として用意しておけば、いつでも3Dモデル祖型をつくることできます。

1 Blenderに配置した線分が描かれた画像ファイル


Blenderに配置した線分が描かれた画像ファイル

2 画像ファイルから線分を自動トレースして生成したカーブ(ビェジェ曲線)


画像ファイルから線分を自動トレースして生成したカーブ(ビェジェ曲線)

自動トレースはBlenderPythonスクリプトで行います。

3 カーブをメッシュに変換して回転して作成した土器形状


カーブをメッシュに変換して回転して作成した土器形状(ワイヤーフレーム)


カーブをメッシュに変換して回転して作成した土器形状(マテリアルプレビュー)

4 画像ファイルと土器形状の関係


画像ファイルと土器形状の関係

5 メモ

Blender内部での線分自動トレースに成功しました。いろいろ試みて、やっぱりダメかと諦めかけていました。


線分自動トレースが失敗している様子

しかし、最後の最後で成功しました。子どものように喜びます。子どものように喜ぶ理由は、この作業を進める中で、これまで数回自動トレースを試みて全て失敗してきたことの記憶がよみがえったからです。その舞台はBlenderではなく、QGIS界隈での印刷物等高線の自動トレースです。紙に印刷された、あるいは画像の中の等高線をそのまま電子化できれば、地形3Dモデル作成がとても容易になります。しかしこれまで、全て満足できる結果を得ることができませんでした。

しかし今回、ChatGPTも半分匙を投げたような状況の中で、気が付けば自動トレースのBlenderPythonスクリプトづくりに成功しました。

これで土器断面形状を型紙として用意しておけば、いつでも3Dモデル祖型をつくることできます。


2026年7月13日月曜日

自然言語でのBlender geometry nodes生成→3Dモデル生成 自作Blenderアドオンの使い勝手 その6

 Generating Blender Geometry Nodes and 3D Models from Natural Language: Usability of My Custom Blender Add-on (Part 6)


As the final test for my custom Blender add-on, I evaluated the process of generating Geometry Nodes and 3D models based on prompts provided by ChatGPT. The results were successful in terms of practicality for 8 out of the 9 tasks. The significance of this add-on is shifting: it is evolving from a mere "Python generation system for creating finished 3D models via natural language" into a tool that facilitates a workflow of "creating a prototype from natural language, followed by iterative rounds of modification and refinement until the final product is achieved."


自作Blenderアドオン開発テストの最終番として、ChatGPTからいただいたお題でgeometry nodes生成→3Dモデル生成をテストしました。9問中8問で実用性合格です。このアドオンの意義は単なる「自然言語による3D完成品作りのためのPython生成システム」から、「自然言語による祖型作成→修正改変→修正改変→修正改変→完成品プロセス」のためのツールに変化しています。

この記事は2026.07.12記事「感動 自然言語での「風で揺れる草原」生成 自作Blenderアドオンの使い勝手 その5」の続きです。

1 事例1 Scatter

事例1は2026.07.12記事「感動 自然言語での「風で揺れる草原」生成 自作Blenderアドオンの使い勝手 その5」で説明した内容です。

2 事例2 道路生成

●プロンプト:Bezier Curveを追加してください。Geometry Nodesで道路を生成してください。道路幅は4m。カーブに沿って道路が作られるようにしてください。カーブを編集すると道路形状も更新されるようにしてください。

●ChatGPTの作業方針:Blender unit = 1m として、編集可能な Bezier Curve を追加し、そのカーブに Geometry Nodes モディファイアを設定します。Geometry Nodes 内で幅4mのプロファイル線を Curve to Mesh でカーブに沿わせ、カーブ編集時に道路メッシュが自動更新される構成です。


2.jpg(Blender画面)

3 事例3 フェンス生成

●プロンプト:Bezier Curveを追加してください。Geometry Nodesで木製フェンスを作ってください。柱は2m間隔。柱の間に横板を3枚配置してください。カーブを編集するとフェンスも変化してください。

●ChatGPTの作業方針:新規作業として、Bezier Curveオブジェクトを作成し、そのカーブ入力を使うGeometry Nodesモディファイアを追加します。柱はカーブに沿って約2m間隔で生成し、横板は3段の連続した木製板としてカーブに追従します。カーブの制御点を編集すると、Geometry Nodesによりフェンス形状も更新されます。


3.jpg(Blender画面)

4 事例4 ランダム岩場

●プロンプト:Plane上に大小様々な岩をランダム配置してください。Geometry Nodesだけで生成してください。岩はIcosphereを変形して作成してください。岩同士は重ならないようにしてください。

●ChatGPT作業方針:新規スクリプトとして作成しました。PlaneにGeometry Nodesモディファイアを追加し、Plane面上にPoisson Disk分布で点を生成して、Icosphere由来の岩メッシュをインスタンス化・ランダム拡縮・回転・ノイズ変形します。岩の最大半径より十分大きい最小点間距離を設定して、岩同士が重ならない安全な配置にしています。

●エラーが出て送信:Python: Traceback (most recent call last):  File "G:\パソコンとソフト\ChatGPT\20260625Blenderアドオン改良\UI版バージョン3開発\k9rtest14.blend\gpt_generated.py", line 234, in <module>  File "G:\パソコンとソフト\ChatGPT\20260625Blenderアドオン改良\UI版バージョン3開発\k9rtest14.blend\gpt_generated.py", line 38, in set_socket_default  File "G:\パソコンとソフト\ChatGPT\20260625Blenderアドオン改良\UI版バージョン3開発\k9rtest14.blend\gpt_generated.py", line 28, in get_socketTypeError: 'int' object is not iterable

●ChatGPTの作業方針:前回エラーは、ソケット取得関数が整数指定を想定しておらず、`int`を反復処理しようとして発生していました。今回はソケット名・複数名・インデックス指定のすべてに対応する安全な関数に修正し、Geometry Nodes全体を再構築する完全スクリプトとして出力します。Plane上にPoisson Diskで点を配置し、Icosphereをノイズ変形した岩をランダムスケール・ランダム回転でインスタンス化します。

●特記事項:Random Rock Scale X、Y、ZがCombine Non Uniform ScaleのXYZにつながれていなかったので、手作業でラインをつなぎ完成品となる。


4.jpg(Blender画面)

5 事例5 成長する木

●プロンプト:Geometry Nodesで樹木を作成してください。幹から枝が分岐し、枝からさらに枝が分岐するようにしてください。乱数で自然な形状にしてください。

●ChatGPTの作業方針:ランダムな再帰分岐で「幹→枝→小枝」を作る曲線スケルトンを生成し、それをGeometry Nodesの「Curve to Mesh」で太さ付きの木として表示するスクリプトです。枝先には簡易的な葉メッシュも追加します。毎回少し違う自然な形になります。


5.jpg(Blender画面)

6 事例6 縄文土器片ランダム配置

●プロンプト:Plane上に縄文土器片を500個ランダム配置してください。Geometry Nodesで作成してください。大きさはランダム。回転もランダム。重なりは少なくしてください。密集する場所と疎らな場所を自然に作ってください。

●ChatGPTの作業方針:Plane上に500個の縄文土器片を配置します。配置点・サイズ・回転・種類番号はPythonで安全に生成し、Geometry Nodesでは点群オブジェクト上に土器片プロトタイプのコレクションをインスタンス化します。重なりを減らすため簡易Poisson風の距離チェックを行い、クラスター中心を混ぜて密集・疎らの自然な分布を作ります。

●エラー送信:縄文土器片が一カ所に塔のように積み上がっています。縄文土器片をPlaneの上に平面的に配置して、密集とまばらを作ってください。

●ChatGPTの作業方針:前回の「一カ所に塔のように積み上がる」原因を避けるため、500個分の配置点をXY平面上の点メッシュとして明示的に作り、各点にスケール・Z回転・プロトタイプ番号属性を持たせました。Geometry Nodesではその点に対して土器片プロトタイプのコレクションを「Separate Children / Pick Instance」で平面的にインスタンス化します。密集と疎らはクラスタ分布+距離チェックで生成し、重なりを抑えています。

●特記事項:点が小範囲で立体的に分布するものになり、結局望む3Dモデルは出来なかった。別に2回トライしたが、いずれも使える結果にならなかった。「密集する場所と疎らな場所を自然に作ってください。」という言葉の意味をChatGPTが誤解している可能性を感じる。


6.jpg(Blender画面)

7 事例7 貝層

●プロンプト:Geometry Nodesで貝層を作成してください。Plane上に二枚貝をランダム配置してください。一定方向にやや配向してください。層厚30cm程度。部分的に密度を変えてください。

ChatGPTの作業方針:Blender 4.4.3でそのまま実行できる新規スクリプトです。Plane上に、30cm程度の層厚を持つ貝層ボリュームを作り、二枚貝形状をランダム配置します。配向は一定方向へ弱く揃え、密度は高密度・低密度パッチで部分的に変化させています。対象PlaneにはGeometry Nodesコントローラ用モディファイアも付与します。


7.jpg(Blender画面)

8 事例8 石器散布

●プロンプト:Plane上に石器を100個散布してください。谷状に密集するようにしてください。Geometry Nodesで作成してください。

●ChatGPTの作業方針:Geometry NodesモディファイアをPlaneに作成し、別途用意した100頂点のポイントメッシュを参照して石器コレクションをインスタンス散布します。ポイントは蛇行する谷筋に沿って生成しているため、Plane上で谷状に密集します。石器は複数の低ポリゴン石器メッシュを作成し、Geometry Nodes側でランダムに選択・回転・スケールします。


8.jpg(Blender画面)

9 事例9 樹木林

●プロンプト:Plane上に樹木を配置してください。林縁では密度を低くしてください。中央部は密度を高くしてください。

●ChatGPTの作業方針:XY平面上の「Plane」を対象にし、存在しない場合は新規作成します。中央ほど採用確率を高く、外周ほど低くするリジェクションサンプリングで樹木を配置し、林縁の密度を低くしています。既存オブジェクトは削除せず、前回生成した同名コレクションのみ作り直します。

●特記事項:プロンプトにgeometry nodesをふくんでいないので、geometry nodesが使われないで、3Dモデルが生成した。


9.jpg(Blender画面)

10 メモ

10-1 結果

プロンプトからそのままgeometry nodes→3Dモデルができたもの。6件(2、3、5、7、8、9)

軽微な手作業追加でgeometry nodes→3Dモデルができたもの。1件(1)

エラーがでたが、エラー克服してgeometry nodes→3Dモデルができたもの。1件(4)

3Dモデルが出来なかったもの。1件(6)

10-2 評価

出来上がったものが望み通りとはかぎらないが、予想以上の好成績といえる。BlenderChatGPTUI版のgeometry nodes生成能力は素晴らしいもので、十分に実用的であるといえる。この能力をいかに引き出すプロンプトを用意するかというユーザーサイドの能力向上が求められる。またgeometry nodesを思い通りに改変して行く上で、ユーザーにgeometry nodes組み立て技術の基礎が求められる。

3Dモデルが出来なかったものは「いい線まで」行っていて、プロンプトを適切に改変するなど、じっくりユーザーが取組めば完成できる可能性を感じる。今後プロンプトを「祖型生成+対話的改良」のプロセスに区切って、試したい。

10-3 感想

このアドオンの意義は単なる「自然言語による3D完成品作りのためのPython生成システム」から、「自然言語による祖型作成→修正改変→修正改変→修正改変→完成品プロセス」のためのツールに変化している。

ChatGPT(web版)と私とのBlenderアドオン開発に関する考え方の調子が合ってきている。


2026年7月9日木曜日

技術メモ Blenderスプレッドシートパネルに遺物点群の属性データを表示する方法

 Technical Note: How to Display Artifact Point Cloud Attribute Data in the Blender Spreadsheet Panel


Using Geometry Nodes in Blender causes an issue where point cloud attributes are no longer displayed in the Object Data Properties. Therefore, I verified a method to display artifact attribute data from artifact point cloud datasets within the Blender Spreadsheet panel.


Blenderでgeometry nodesを使うと、オブジェクトデータプロパティに点群属性が表示されなくなる不都合が生じます。そこで、Blenderスプレッドシートパネルに遺物点群データの遺物属性データを表示する方法を確認しました。

1 Blenderスプレッドシートに遺物点群データの遺物属性データを表示する方法


Blenderスプレッドシートに遺物点群データの遺物属性データを表示する方法

ジオメトリノードで遺物点群が格納されたオブジェクト情報ノードにビューアーノードを接続すれば、スプレッドシートパネルに遺物属性データが表示されます。

この画面では約6万遺物、40属性データの一部が表示されています。

2 メモ

これまでオブジェクトデータプロパティ→属性で属性情報の有無をみてきました。しかし、geometry nodesをつかうとオブジェクトデータプロパティ→属性では属性情報が完全に表示されないことがあることを知りました。その不都合を回避するために、geometry nodesにおける属性情報確認はオブジェクト情報にビューアーを接続して、スプレッドシートパネルで確認することにしました。


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 メモ

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


2026年6月28日日曜日

postgreSQL→Blender点群表示の準備とスクリプト概要

 Preparing to Display PostgreSQL Point Cloud Data in Blender: Overview of the Script


I have obtained a poster outlining the script and the preparations needed to stream data from PostgreSQL into Blender for point cloud visualization. From a technical standpoint, it looks like this could be implemented right away.


postgreSQLからデータをBlenderに流し点群表示する準備とスクリプト概要のポスターを入手しました。技術的にはすぐにでもできそうです。

1 postgreSQL→Blender点群表示の準備とスクリプト概要


postgreSQL→Blender点群表示の準備とスクリプト概要

ChatGPTに次の質問をしたところ、このポスターがかえってきました。

「postgreSQLのあるテーブルから多数レコードのID、3D座標、各種属性データをBlenderに渡して、Blender3Dビューポートに点群で表示させるとします。そのための準備と作成BlenderPythonスクリプトの概要について教えてください。その点群をgeometry nodesで絞り込みなど分析が可能となると考えてよいでしょうか。」

2 メモ

postgreSQLを単なるデータ保管場所ではなく、研究基盤として位置付け、Blenderをその基盤の上で動く3D可視化・解析フロントエンドと考えることにします。

postgreSQL操作技術の習熟を加速することにします。


2026年1月27日火曜日

技術メモ Blenderに配置した平面画像の視認性向上

 Technical Note: Improving the Visibility of Planar Images Placed in Blender


I investigated ways to improve the visibility of planar images placed in the Blender 3D viewport and found that color inversion made them easier to see. I decided to display planar images for analysis and consideration in Blender using color inversion.


Blender3Dビューポートに配置した平面画像の視認性向上について検討し、カラー反転により見やすくなることに気が付きました。分析検討素材としての平面画像は、Blenderでカラー反転表示することにします。

1 Blender3Dビューポートに配置した平面画像の視認性向上策検討

1-1 Blender3Dビューポートに配置した平面画像(有吉北貝塚セクション図)

40年前に作成された有吉北貝塚セクション図は方眼紙に鉛筆書きした資料ですが、著しく劣化が進んでいました。スキャナーで得た画像を活用できる状態にするためにPhotoshopで調整して、解読できる状態にまで持ち込みました。その結果本来水色の方眼が黄色くなり、通常資料と比べ視認性が劣っています。

この平面画像をBlender3Dビューポートに配置して観察するととても見ずらい資料となっています。


平面画像を配置したBlender画面1


平面画像を配置したBlender画面2

1-2 平面画像の視認性向上策

Blender3Dビューポートに配置された平面画像の視認性向上策として次のマテリアルノードでの試みをしてみました。

いずれもシェーダーエディターで「Image Texture」ノードと「Principled BSDF」ノードの間に別のノードを挿入する試みです。

【画像を濃くする】

・「RGBカーブ」ノード挿入(カーブをS字にする)

・「HSV(色相/彩度/明度)ノード挿入(明度、彩度の調整)

・「輝度-コントラスト」ノード挿入(輝度、コントラストの調整)

【画像カラーを反転させる】

・「カラー反転」ノード挿入

このうち、「カラー反転」ノード挿入が視認性向上策として最も効果的であることに気が付きました。


平面画像を配置したBlender画面1(画像はカラー反転)


平面画像を配置したBlender画面2(画像はカラー反転)

Blenderに置ける分析作業では必要に応じて平面画像をカラー反転表紙することにします。

2 Blender3Dビューポートに配置された「a–c–b 連続断面を1枚の横長画像にする方法」開発(非採用)


Blender3Dビューポートに配置されたa/c/b断面

a:13断面(横断面)

b:20断面(縦断面)

c:14断面(横断面)

a/c/b断面で囲まれる空間の内部に視点を移動して、その視点から見ることができる「a–c–b 連続断面を1枚の横長画像にする方法」の開発に取組みました。

具体的には空間内部にオルソ投影カメラを設置して3枚の写真を撮影してつなげる方法です。作業のなかで次の点で手間が必要であり、現状の方法(原図をPhotoshopで切り抜き、Illustratorで貼り付け)と比べてメリットがないので、非採用としました。失敗したということです。

1 カメラ撮影画像(レンダリング画像)が暗く、調整に手間取ります。。この記事のBlender画像はすべてスクリーンショット画像です。光源を配置しても、レンダリングするとスクリーンショット画像より暗くなります。

2 カメラの調整作業が必要であり、さらに撮影画像の貼り付け操作が必要で、かかる手間が現状方法とくらべ効率化が図れません。

ただ、上図のような「a/c/b断面で囲まれる空間」のわかるスクリーンショット画像を作成すると、現状作業をする際に、どの部分を切り抜いたら良いかを確認する参考資料となることに気が付きました。これは検討副産物として採用します。

3 貝層断面原図(集成セクション図)の視認性向上策としてのカラー反転図活用(非採用)


貝層断面原図(集成セクション図)


貝層断面原図(集成セクション図)(カラー反転図)

Blender操作ではなく、Illustratorを使う一般作業でも、貝層断面原図(集成セクション図)は視認性が良くありません。そこで視認性向上策案としてのカラー反転図を作成してその有効性を検討しました。

分層線などの視認性はよくなりますが、それ以外が黒くなり、文字をはじめとする書き込みがしにくく、全体としてみずらい図面になることがわかりました。従って、一般図におけるカラー反転図利用は非採用としました。

2026年1月22日木曜日

ChatGPTそのものをBlenderのアドオンにする

 Making ChatGPT itself a Blender add-on


I implemented ChatGPT itself as a Blender add-on. This is the first prototype, and I will continue to improve its usability. I plan to develop it into a powerful and effective tool for 3D spatial analysis of shell mounds using Blender.


ChatGPTそのものをBlenderのアドオンとして実装しました。最初のプロトタイプであり、今後使い勝手を改良します。Blenderによる貝塚3D空間分析などの有力効果的ツールとして育てる予定です。

1 ChatGPTそのものをアドオンとして実装したBlender画面


ChatGPTそのものをアドオンとして実装したBlender画面


アドオン画面

画面では次のプロンプトを実行しています。

「位置X:0m,Y:0m,Z:0m、寸法X:2m,Y:2m,Z:0m、回転X:0°,Y:90°,Z:0°に平面オブジェクトを配置し、-X軸方向に0.5m間隔で同じ寸法、回転の平面を999枚配置してください。合計1000枚の平面にランダムに色を塗ってください。」

2 メモ

・MCP(Model Context Protocol)に興味を持ち、向学のために、とりあえず自分で実現できそうなChatGPTのBlenderアドオン化に取組みました。MCPによるBlender操作が本命です。

・早朝に作業着手して、アドオン完成したのは0時直前です。

・最後に難渋したのはBlenderのAddonPreferences画面のOpenAI API Key入力ができないという本来機能とは関係ない部分でした。途中で放棄しようと何回か思ったのですが、粘って良かったです。(Blender側のPreferences画面入力欄に文字数制限があることに最後に気が付き、突破できました。)

・現状ではプロンプト入力欄が狭すぎることや、開発用デバックボタンが残っているなど未成品ですが、とにもかくにも、ChatGPTそのものをBlenderアドオンとして実装できたことはうれしいことです。今後改良を重ね、考古学習の有力ツールとして育てることとします。


2025年12月16日火曜日

技術メモ Illustratorで描いたパスをBlenderにプロットする方法

 Technical Note: How to Plot Paths Drawn in Illustrator to Blender


I plotted the shell boundary lines of a section drawing drawn in Illustrator to Blender as an SVG file. This eliminated the need to draw the same boundary lines twice in Blender.


Illustratorで描いたセクション図の貝層界線をSVGファイルでBlenderにプロットしました。これにより、Blenderで同じ界線を描く二度手間が解消されました。

1 Illustratorで描いたパスのBlenderプロット


Illustratorで描いたパスのBlenderプロット

Illustratorで描いた貝層界線(パス)をSVGファイル出力し、Blenderにインポートするとカーブになります。カーブの位置、大きさを正確に調整してからメッシュオブジェクトにすることにより、遺物点群集計などに使うことができます。


Illustratorで貝層界線(パス)を描いている様子


Illustratorで描いたパス

2 メモ

界線カーブをメッシュオブジェクトに変換し、押し出しにより厚みを持たせ、両側に面を貼ることで、貝層分層の姿に対応した3次元メッシュオブジェクトをつくることができます。このメッシュオブジェクトを利用して、スリットに分布する遺物を貝層分層毎に把握、集計できるようになります。


スリット分布遺物の貝層分層別集計用のメッシュオブジェクト

2025年11月4日火曜日

技術メモ Blenderにプロットした遺物(頂点)の属性確認方法

 Technical Note: How to Check the Attributes of Artifacts (Vertices) Plotted in Blender


The artifact database (55,892 records, 39 attributes) for the shell layer on the northern slope of the Ariyoshikita Shell Mound was plotted directly as vertices in Blender. I discovered a way to check the attribute data for a single vertex in Blender, so I've written this note.


有吉北貝塚北斜面貝層の遺物データベース(55892レコード、39属性)はそのままBlenderに頂点でプロットしてあります。Blender画面で頂点1つのある属性のデータを確認する方法を知りましたので、メモしました。

1 遺物データベースのBlender取り込み

有吉北貝塚北斜面貝層の遺物データベース(55892レコード、39属性)はそのままBlenderに頂点でプロットしてあります。


55892レコード、39属性がそのままBlenderにプロットされている様子

2 Blender画面で特定頂点の特定属性データを知る方法


Blender画面で特定頂点の特定属性データを知る方法

・編集モードで特定頂点を表示します。

・オブジェクトデータプロパティ→属性→(知りたい)属性を選択

・メッシュ→属性を設定

この操作で画面にその属性のデータが表示されます。

なお、属性のデータに日本語を使うと不都合が発生する可能性があるので、自分は使っていません。自分は属性の値はすべて類型区分の結果である整数値にしています。

3 メモ

Blender3Dビューポートでは頂点分布を観察しますが、上記属性データを知る方法は「この頂点は何を意味するのか」という疑問に即座に答えを出してくれるので、とても有用です。

4 参考

統計分析(例 全遺物の最近隣距離計測)はBlenderの外でPythonで行い、その結果をBlenderにプロットしています。

Blenderは主に種別、属性区分別などの表示ツールとして使っています。

Blenderで幾つかのデータを複合表示して、それを新たなデータとしてcsvファイルに書き出し、そのcsvファイルをPythonで分析することもあります。


2025年9月24日水曜日

Blenderブレイクスルー技術のはじめての体感

 My first experience with Blender's breakthrough technology


I experienced a breakthrough technology in Blender. Previously, I plotted 3D coordinate artifacts as cubes in Blender. For 12,422 artifacts, it took 86 minutes. However, plotting them as vertices took less than a second. It was an incredible experience.


Blenderで「これがブレイクスルー技術だ」という体感をしました。これまで3D座標付き遺物をBlenderにCUBEとしてプロットしていました。12422遺物では86分かかりました。ところが、頂点としてプロットすると1秒以下です。信じられないような実体験です。

1 CUBEとしてのプロット


CUBEとしてのプロット

BlenderPythonを使って、12422遺物をCUBEとしてBlenderにプロットすると、86分かかりました。(注:遺物数が多くなると、ID重複照合に要する時間のためか、幾何級数的にプロット時間が増えます。)

2 頂点としてのプロット


頂点としてのプロット

BlenderPythonを使って、12422遺物を頂点(頂点一つだけのオブジェクト)としてBlenderにプロットすると、1秒以下でした。手動ストップウォッチで計測しようとしたのですが、手筋肉反射よりもプロットの方が勝りました。つまり計測不能でした。

注:頂点としてプロットするBlenderPythonでは、超高速化のためにPythonループより何倍も速い「 foreach_set 」アルゴリズムを使っています。

3 頂点のCUBE実体化


頂点のCUBE実体化

geometry nodesにより12422頂点をCUBEオブジェクトに実体化する時間は1秒以下でした。驚くべき速さです。

4 感想

86分間のBlender作業が実質0分になるという体験は今回はじめてです。こういう技術が「ブレイクスルー技術だ!」と実感しました。すばらしい突破体験です。「頂点でプロット、geometry nodesで実体化」という技術はChatGPTとのコミュニケーションで得たものです。自分にとって、ChatGPT活用意義が大きいことに気が付きます。


2025年9月22日月曜日

Blenderの3D座標付きデータベース格納機能

 Blender's 3D Coordinate Database Storage Function


I tested a system that stores attributed artifact data as vertices in Blender, then extracts and materializes (objects) them by attribute using geometry nodes. Since the artifacts are materialized at the end, the operation is extremely light (and comfortable). ChatGPT boasts that it can easily handle a database of 500,000 objects.


属性付き遺物データを頂点でBlenderに格納し、それをgeometry nodesで属性別に抽出し実体化(オブジェクト化)するシステムを試しました。最後に実体化するので、操作は超軽い(快適)です。ChatGPTは50万のデータベースでもへっちゃらだと豪語しています。

1 テストデータの頂点プロット


テストデータ

ID(遺物番号)、x座標、y座標、z座標、class(遺物分類)の5項目(属性はIDとclassの2つ)3392データからなるcsvファイルをテストデータとしました。

テストデータをBlenderPythonで、属性も含めてBlenderに頂点(頂点一つだけのオブジェクト)としてプロットしました。属性2つは頂点に付与されています。


テストデータの頂点としてのプロット

2 geometry nodesによる属性区分別抽出表現


geometry nodes

つぎの3つの情報を「ポイントにインスタンス作成」に渡し、実体化(オブジェクト化、ここでは0.02㎝球、赤色)します。

・遺物を指標する(3D座標付き、属性付き)頂点の入力

・選択対象とする属性と区分(値)の設定

・表現オブジェクトの形状、色等の設定

classに1を入力すると土器・土製品の分布になります。


geometry nodesによる土器・土製品の分布

classに2を入力すると石器・石の分布になります。


geometry nodesによる石器・石の分布

classに5を入力すると骨・歯の分布になります。


geometry nodesによる骨・歯の分布

3 感想

BlenderでID(遺物番号)、x座標、y座標、z座標の12000データを実体(CUBE)としてプロットした時、その時間は82分かかりました。そのようなばかげた時間消費は今後なくなるので、遺物作業により熱が入ります。やる気が出てきます。テストデータでも3392件のプロットは文字通り一瞬であり、パソコン操作は軽く、快適です。

5万データを属性とともに頂点で入力し、geometry nodesで必要に応じて分析実体化するという方法はChatGPTとのやりとりのなかで知りました。ChatGPTはデータが50万で属性が30あってもBlenderはへっちゃらだと豪語しています。

geometry nodesはBlenderのほとんどの機能を実現できるので、例えば、属性区分別に色分けしたり、オブジェクトの形状や大きさを変えたり、点滅させたり、振動させたりなど様々な試みを気軽に試すことができます。

2025年7月9日水曜日

Blenderべジェ曲線の頂点インデックス(番号)表示

 Blender Bezier curve vertex index (number) display


Blender Bezier curve vertex index (number) display is now possible. This allows efficient and accurate manipulation of Bezier curves. This BlenderPython has been completed for the first time in a month.


Blenderべジェ曲線の頂点インデックス(番号)表示ができるようになりました。これでべジェ曲線の操作が効率的かつ正確にできるようになります。1カ月ぶりにこのBlenderPythonが完成しました。

1 Blenderべジェ曲線の頂点インデックス(番号)表示


Blenderべジェ曲線の頂点インデックス(番号)表示

この例は閉じたべジェ曲線で、0~77のインデックスが表示されています。

2 Blenderバージョン4.4.3用の頂点インデックス表示BlenderPythonスクリプト


import bpy
import blf
from bpy_extras import view3d_utils

handler = None

def draw_callback_px(self, context):
    obj = context.active_object
    if not obj or obj.type != 'CURVE' or obj.mode != 'EDIT':
        return

    region = context.region
    rv3d = context.space_data.region_3d
    curve = obj.data

    font_id = 0
    blf.size(font_id, 14)

    for spline in curve.splines:
        if spline.type != 'BEZIER':
            continue

        for i, bez in enumerate(spline.bezier_points):
            if not bez.select_control_point:
                continue

            # 3D位置 → スクリーン座標
            co_world = obj.matrix_world @ bez.co
            screen_coord = view3d_utils.location_3d_to_region_2d(region, rv3d, co_world)

            if screen_coord:
                blf.position(font_id, screen_coord.x, screen_coord.y, 0)
                blf.draw(font_id, str(i))

def register_draw_handler():
    global handler
    if handler is None:
        handler = bpy.types.SpaceView3D.draw_handler_add(
            draw_callback_px, (None, bpy.context), 'WINDOW', 'POST_PIXEL'
        )
        print("インデックス表示を開始しました。")

def unregister_draw_handler():
    global handler
    if handler is not None:
        bpy.types.SpaceView3D.draw_handler_remove(handler, 'WINDOW')
        handler = None
        print("インデックス表示を停止しました。")

class CURVE_OT_toggle_index_display(bpy.types.Operator):
    bl_idname = "curve.toggle_index_display"
    bl_label = "ベジェインデックス表示切り替え"

    def execute(self, context):
        if handler is None:
            register_draw_handler()
            self.report({'INFO'}, "表示開始")
        else:
            unregister_draw_handler()
            self.report({'INFO'}, "表示停止")
        return {'FINISHED'}

def register():
    bpy.utils.register_class(CURVE_OT_toggle_index_display)

def unregister():
    bpy.utils.unregister_class(CURVE_OT_toggle_index_display)

if __name__ == "__main__":
    register()
    bpy.ops.curve.toggle_index_display()

3 頂点インデックス(番号)表示の意義

Blenderで、XY座標平面に縄文遺構の幾つかの縁取線をトレースし、それらの縁取線を該当する標高に移動し、その縁取線からアドオンCurves To Meshで3Dモデルを作成します。しかし、縁取線は等高線ではなく、標高が変化する線分です。その標高変化を表現するには、標高が判明している少数の頂点の間をトポロジー的に補間する必要があります。その補間作業のために、標高判明頂点を把握する必要があり、どうしても、全体の頂点インデックスが必要になります。

このBlenderPythonスクリプトにより、その頂点インデックスが3Dビューポートで一見して判るようになりました。

縄文遺構3Dモデル構築作業にとって重要な基礎ツールの一つができました。

4 メモ

このBlenderPythonスクリプトは1カ月程前にChatGPTにより作成チャレンジして、半分失敗しました。当時作成したスクリプトはBlenderバージョン3では使えましたが、バージョン4では使えませんでした。失敗した理由は、ChatGPTにBlenderバージョンを明示しなかったからであると推察します。

今回はBlenderバージョン4.4.3で使うことを前提に指示しました。ChatGPTとのやりとりの中で、Blenderバージョン4.4の特性に関する扱いが幾つか出てきました。このような経緯から、Blenderのバージョンを明示しなければ、今回も失敗していた可能性があります。


2025年7月1日火曜日

BlenderのprimitiveCUBEのデフォルトの大きさが2m×2m×2mである理由

 Why is the default size of Blender's primitiveCUBE 2m x 2m x 2m?


I investigated why the default size of Blender's primitiveCUBE is 2m x 2m x 2m, not 1m x 1m x 1m. I understood that this is related to visibility and operability (visual sensation on a computer and operability with hand muscles) when constructing and generating a CUBE as a solid object at the origin of 3D space.


BlenderのprimitiveCUBEのデフォルトの大きさが1m×1m×1mではなく、2m×2m×2mである理由を調べました。3D空間原点で立体オブジェクトとしてのCUBEを構築生成する場合の視認・操作性(パソコンでの視認感覚・手筋肉操作性)が関わっていることを理解しました。

1 CUBE大きさに関するケアレスミス

有吉北貝塚北斜面貝層の3D座標取得遺物をBlender3DビューポートにプロットするBlenderPythonスクリプトを状況に応じて幾つか作成しています。遺物すべてを5㎝×5㎝×5㎝のCUBEで表現しています。

最近、プロット高速化改善策を施したBlenderPythonスクリプトを新たにつくり走らせたところ、遺物の大きさ(CUBEの大きさ)が異なってしまうミスを犯しました。ミスの原因は、BlenderにおけるCUBEのデフォルトの大きさは2m×2m×2mであると理解していましたが、primitiveCUBEと指定すれば、それはprimitiveCUBE(size=1)を意味すると勘違いしていたからでした。

このケアレスミスをキッカケに、BlenderではなぜCUBEのデフォルトの大きさ、つまりprimitiveCUBEの大きさが2m×2m×2mであり、区切りのよい単位と自分が考えた1m×1m×1mのCUBE(つまりprimitiveCUBE(size=1))ではないのか、その理由をwebやChatGPTで調べてみました。

2 Blenderにおいて bpy.ops.mesh.primitive_cube_add() で生成されるCUBEのデフォルトサイズが size=2(= 2m×2m×2m)である理由

理由は3つほどあるようです。

2-1 Blenderの内部基準(Unit Scale)が 「1 Blender Unit = 1m」であるため

Blenderではデフォルトの単位系は「1 Blender Unit = 1m」です。

その上で、size=2 という引数は「中心から各方向に1m(つまり全体で2m)」という意味になります。

Blenderでは空間原点(あるいは中心)との対応でオブジェクトを認識し操作しますから、原点(あるいは中心)とCUBEの大きさを考える時、次のような関係になります。

size=2 → -1m 〜 +1m の立方体(合計 2m)

size=1 → -0.5m 〜 +0.5m の立方体(合計 1m)

つまり、原点(あるいは中心)を意識し、それとの関係でCUBEの大きさを捉える時、size=2 という引数が「1 Blender Unit = 1m」に対応することになり、最も基礎的大きさであると考えることができます。

2-2 分かりやすい視認性を優先した設計

Blenderでは、画面立上げと同時に立方体(CUBE)が追加され、表示されます。この際、1m立方体だと小さすぎて3Dビューポートで目立たないことがあります。初心者ユーザーでも「見てすぐわかる形」が重要であり、そのため、デフォルトでやや大きめの 2mサイズ を選んでいると考えられます。

2-3 Blender初期バージョンとの互換性

Blenderの初期のバージョンでは、実世界単位(mやcm)ではなく「Blender Unit」が独立した単位として使われていました。その当時、size=2(-1〜+1)で作られたCUBEは、原点を中心に対称な形で作るための定番でした。後から単位系(Metric)に対応した際に、古いスクリプトとの互換性を保つため、「デフォルトsize=2」が維持された可能性があります。

3 感想

BlenderのprimitiveCUBEのデフォルトサイズがsize=2である理由を知ることができました。その根本は原点(中心)から「1 Blender Unit = 1m」のサイズのCUBEという点にあります。それは、3D空間のなかでCUBEを構築生成する行為(パソコン画面で3D空間を認識して、マウスやキーボードを手筋肉で操作してCUBEをつくる活動)があってはじめて生まれた観念であると理解しました。腑に落ちました。


Blender3DビューポートにおけるprimitiveCUBE(size=1)とprimitiveCUBE(size=2)


2025年5月14日水曜日

Blenderの全く新しい使い方 3D分布思考ツール

 A completely new way to use Blender: a 3D distribution thinking tool


I've come up with a completely new way to use Blender. It's a way to use it as a tool to analyze and think about the 3D distribution of artifacts excavated from shell mounds. Blender is used not as a 3D object generation tool, but as a tool to analyze and think about 3D distribution.


Blenderの全く新しい使い方にたどり着きました。貝塚から出土した遺物3D分布の分析思考ツールとしての使い方です。Blenderを3Dオブジェクト生成ツールではなく、3D分布を分析し思考するツールとして活用します。

1 Blenderアドオン 「3D分布思考ツール(試作1号)」を使っている様子


Blenderアドオン 「3D分布思考ツール(試作1号)」を使っている様子

自作Blenderアドオン「3D分布思考ツール(試作1号)」は次の2つの機能を有します。

1 研究メモをBlenderテキストエディターに表示します。

2 表示遺物を色塗りします。(選択したオブジェクトを赤、青、白、緑、黄のいずれかの色に塗ります。

この機能を活用して、思考すべき(分析すべき)事柄や留意点をテキストで確認しながら、表示遺物を色塗りなどでいじり(手作業で分析し)、その分布特性を思考します。思考結果はテキストエディターに文章として書き込み、保存します。

Blenderを3Dオブジェクト生成ツールとしてではなく、分析思考ツールとして活用します。

2 Blenderアドオン 「3D分布思考ツール(試作1号)」


プロパティ


記述

3 メモ

Blenderの全く新しい使い方にたどり着きました。

今回作成アドオンは試作1号です。今後計画的分析作業の各段階に対応する機能を有する、より実戦的な分析思考ツールに発展させることにします。


技術資料 Blender閉じた辺ループのブリッジが合理的に行われる原理

 Technical information: The principle behind Blender's closed edge loops bridging


I use closed edge loops bridging as the main tool for creating 3D shell models in Blender. I've come to understand why bridging is performed so rationally, so I've made a note of it. Blender is performing complex calculations behind the scenes.


Blenderで貝層3Dモデルを作成するメインツールとして、閉じた辺ループのブリッジを活用しています。なぜ合理的にブリッジが行われるか理解できましたので、メモしました。Blenderは裏で複雑な計算をしています。

1 閉じた辺ループのブリッジの例


Blender3Dビューポートに配置された2つの閉じた辺ループ


辺ループのブリッジで中空3Dモデルが描画された様子


同

2 閉じた辺ループのブリッジが合理的に行われる原理


閉じた辺ループのブリッジが合理的に行われる原理

A0とB0の距離、A1とB1の距離・・・の組合わせの総延長距離r1

A0とB1の距離、A1とB2の距離・・・の組合わせの総延長距離r2

・・・

可能な全ての組合わせ(反転も含める)の総延長距離rを比較して「対応頂点間距離の合計が最小になる組合わせ(シフト)」を自動選択して、その組合わせで立体面を描画しています。

この例ではA0とB0の距離、A1とB1の距離・・・の組合わせの総延長距離が最小となり、その組合わせで立体面が描画されています。

3 出典

ChatGPTの次の回答によりました。

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

Blender の Bridge Edge Loops は、内部的には以下のような手順で「閉じた辺ループ同士」の頂点対応を決めています。

1. ループの検出

   選択した辺をたどって、同じ辺を一周するまで連続する辺を辿り、閉じたループとして頂点リストを列挙します(どこから始めてもループは円環状に扱われる) ([docs.blender.org][1])

2. デフォルト対応づけ (Twist=0 の場合)

   頂点数が同じ2つのループ A と B があるとき、A[i]→B[i] の順で対応づけを行います。ループは環状リストなので、たとえば A[0] を B のどの頂点と対応させるかは「シフト量」によって決まりますが、Twist=0 ではループをずらさずにそのまま 1:1 マッピングします ([docs.blender.org][1])

3. Twist パラメータによるオフセット

   UI の「Twist」スライダーを動かすと、B ループ全体を環状に何ステップずらすかを指定できます。これによって、A[0]→B[k] のように対応関係を回転させられます ([Superhive (formerly Blender Market)][2])

   実際には、Blender は可能なすべてのシフト(およびループの反転)を評価し、「対応頂点間距離の合計が最小になるシフト」を自動選択していると考えられます。

4. ブリッジの生成

   対応づけが確定したら、A[i] と B[i+シフト] をエッジでつなぎ、必要に応じて中間ループを挿入(Number of Cuts)、Interpolation や Smoothness の設定を反映して面を張ります ([docs.blender.org][1])

このように、橋渡しされる2つの閉じたループは「環状リストとして順序付け」→「同じインデックス同士で結ぶ(必要ならシフト)」→「面を生成」という原理で、常に“ずれなく”合理的な対応づけが行われます。

[1]: https://docs.blender.org/manual/en/latest/modeling/meshes/editing/edge/bridge_edge_loops.html?utm_source=chatgpt.com "Bridge Edge Loops - Blender 4.4 Manual"

[2]: https://blendermarket.com/products/curves-to-mesh/docs?utm_source=chatgpt.com "Curves To Mesh - Blender Market"

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

4 メモ

貝層3Dモデルを作成するツールとして、当初はBsurfaces機能を使っていたのですが、Bsurfaces機能は場面により使えないことに気が付き、汎用的に使えるのは辺ループのブリッジ機能であることに気が付き、着目しています。

辺ループのブリッジをgeometry nodesで表現しようと大格闘しているのですが、超膨大で超複雑なノードを組まないとできないことを知りました。(物事を簡単に処理するためにgeometry nodesがあると考えていたのですが、素手の操作で簡単な事柄を、超膨大・超複雑なgeometry nodesで表現しても、その意義はありません。[それを1つのノードにまとめたものが有料アドオンの中に含まれているので、それは意義があります。])

このような検討の中で、そもそも閉じた辺ループのブリッジの原理はなんなのかという素朴な疑問が生まれ、ChatGPTに質問して、回答を得た次第です。