Python script to represent mesh floor plan in Blender
When examining the 3D distribution of archaeological artifacts in Blender, it becomes necessary to create a related 2D distribution map (mesh diagram). So I made a Python script to express the mesh plan in Blender with the help of ChatGPT. Convenient.
Blenderで考古遺物の3D分布を検討する際に、関連して2D分布図(メッシュ図)を作成する必要が生まれます。そこでBlenderでメッシュ平面図を表現するPythonスクリプトをChatGPTの助けを借りて作りました。便利です。
1 2D分布図(メッシュ図)をBlenderで作成する必要性
有吉北貝塚北斜面貝層では全ての遺物についてそれが出土した2m×2mメッシュ番号が記録されていて、土器以外の遺物はすべて出土メッシュ番号が発掘調査報告書に記載されています。従って出土遺物のメッシュ別分布図を作成することができます。これまでの作業では遺物のメッシュ別分布図はデータをExcelで集計してQGISで表現してきています。
QGISで表現したメッシュ別分布図を使った資料
しかし、3D分布検討はBlenderで行い、2D分布検討はQGISで行うという作業は複雑であり好ましくありません。全遺物の3D分布検討を視野にいれたとき、ぜひとも2D分布図(メッシュ図)もBlenderで作成し、3D分布検討と2D分布検討を同じBlenderで行うことが大切になります。
2 2D分布図(メッシュ図)をBlenderで作成するPythonスクリプト
2-1 ChatGPTに質問
ChatGPTに次の質問をしました。
……………………………………………………………………
次の操作を行うBlenderPythonスクリプトを教えてください。
1 Blenderで既に選択してあるメッシュオブジェクトが1つあります。
2 そのメッシュオブジェクトを最初に多数コピーして、それを別の座標に次々に配置します。
メッシュオブジェクトを配置したい座標は、テキストファイル'C:/tmp/XYZData.txt'に(任意記号,x,y,z)の順番で書かれています。
3 アウトライナーのシーンコレクションに新しいコレクションを作成します。
4 新しく作成したコレクションに、先ほど座標に配置した多数メッシュオブジェクトを格納します。
……………………………………………………………………
2-1 ChatGPTからの回答
ChatGPTから次の回答をもらいました。
……………………………………………………………………
import bpy
# テキストファイルのパス
filepath = 'C:/tmp/XYZData.txt'
# メッシュオブジェクトの名前
object_name = bpy.context.active_object.name
# テキストファイルを読み込む
with open(filepath, 'r') as file:
lines = file.readlines()
# アクティブなシーンを取得する
scene = bpy.context.scene
# 新しいコレクションを作成する
new_collection = bpy.data.collections.new('NewCollection')
scene.collection.children.link(new_collection)
# 行ごとに処理
for line in lines:
# カンマで分割してデータを取得
data = line.strip().split(',')
symbol, x, y, z = data[0], float(data[1]), float(data[2]), float(data[3])
# メッシュオブジェクトをコピーする
bpy.ops.object.select_all(action='DESELECT')
bpy.data.objects[object_name].select_set(True)
bpy.context.view_layer.objects.active = bpy.data.objects[object_name]
bpy.ops.object.duplicate(linked=False)
new_object = bpy.context.active_object
# コピーしたオブジェクトの座標を設定する
new_object.location = (x, y, z)
# コピーしたオブジェクトを新しいコレクションに追加する
new_collection.objects.link(new_object)
# オブジェクトの名前を設定する
new_object.name = symbol
……………………………………………………………………
このスクリプトでは、指定されたテキストファイルのパスをfilepath変数に、Blenderのアクティブなオブジェクトの名前をobject_name変数に指定してください。
スクリプトを実行すると、指定されたテキストファイルから座標データを読み取り、メッシュオブジェクトをコピーして指定された座標に配置します。コピーされたオブジェクトの名前は、テキストファイルの記号と対応付けられます。
また、スクリプトでは新しいコレクションを作成し、コピーしたオブジェクトをそのコレクションに格納します。新しいコレクションの名前は"NewCollection"ですが、必要に応じて変更してください。
同様に、このスクリプトもBlender内で実行する必要があります。BlenderのPythonスクリプトエディタやPythonコンソールなどから実行してください。また、スクリプトを実行する前に、Blender内でメッシュオブジェクトを選択しておく必要があります。
……………………………………………………………………
ChatGPTの回答
2-3 ChatGPT回答のPythonスクリプトの結果
次のようなメッシュ番号と3D座標位置を書いたテキストを用意しました。
用意した座標テキスト
次に、2m×2mメッシュの大きさの平面メッシュオブジェクト(マテリアルは青色)を事前にBlender画面内に作成して選択しました。
次にChatGPT教授のPythonスクリプトをScripting画面に貼り付けて走らせました。
その結果所定のメッシュに青色平面が貼り付きました。この例は前期土器出土メッシュ分布図です。
作成された2D分布図(メッシュ図)
作成された2D分布図(メッシュ図)斜め表示
Blenderのアウトライナーを見ると、新たに配置された平面メッシュオブジェクトにメッシュ番号が付き、それらが新コレクションに格納されています。
アウトライナーの様子
自分が望んだPythonスクリプトを入手することができました。
3 今後の展開
このPythonスクリプトでは平面メッシュだけでなく、厚さのある立方体オブジェクトや枠型形状オブジェクトでも同じ操作が出来ました。(土器や遺物そのもののオブジェクトでも出来ると思います。)
このPythonスクリプトを工夫すればメッシュ別に数量を立方体の高さで表現することも可能になります。つぎのようなメッシュ別数量の立体表現もPythonスクリプトで時間をかけないで作成するところまで射程に入りました。
過去に手作業で作成したメッシュ別数量の立体表現
Blenderで3D分布分析、2D分布分析を統合的に行うための大きな基礎が出来ました。もうQGISの助けを借りる必要はありません。
4 感想
4-1 感想 1
Pythonスクリプト作成で、ChatGPTに質問して適切な回答を得るコツが少し判ってきたような気がします。自分はそのスクリプトを書けないけれども、論理的な展開はこれこれだと判った上でそれを丁寧に説明すれば、正解を得られる確率が高まるようです。
4-2 感想 2
ChatGPTから自分ができない(判らない)ことを即座に教えてもらって、大いに助かっているのですが、そのChatGPTは無料で、24時間営業であることに一抹で虚弱な違和感・不安定感を感じます。そしてなによりもChatGPTに気遣いする必要がないことに不思議と戸惑いを感じます。通常、先生・指導者とか同僚・友人知人に物事を教えてもらうときは、教えてもらったことが役立っても役立たなくても何らかのお礼を、少なくても言葉レベルでは、します。
4-3 感想 3
人から何かを教えてもらうときは、「こんなレベルの低いことを教わるのは恥ずかしい」とか「自分が調べもしないで、相手に教わるのは相手に失礼だ」とか、自分と相手の人間関係に起因する様々な感情が自分に生起します。だれでもそうした感情をどれだけ意識するかは別にして必ず持ちます。そうした感情がChatGPT利用時にふと脳裏をよぎりました。それがお門違いであることはよくわかります。ChatGPTと自分との感情的関係が自分にはまだ整理されていません。
0 件のコメント:
コメントを投稿