2023年5月9日火曜日

Blenderで多数座標にCUBEを一括生成するスクリプト

 Script to generate CUBE at multiple coordinates in Blender


ChatGPT taught me a simple BlenderPython script that batch-generates CUBEs in multiple coordinates in Blender. I had a great time using ChatGPT to help me get started with Python.


Blenderで多数座標にCUBEを一括生成する簡潔なBlenderPythonスクリプトをChatGPTに教えてもらいました。ChatGPTにPython入門の第1歩をサポートしてもらい、楽しい一時を過ごしました。

1 やりたいことがら

資料を読み取り、有吉北貝塚北斜面貝層出土土器破片や遺物の3D座標を大量に入手し、Blender3D空間にプロットする作業が生まれそうです。その際、遺物3D座標(Excel情報)を効率的にBlenderに投入して3D空間表示する方法を知りたいのです。

2 Blenderで多数座標にCUBEを生成するBlenderPythonスクリプト

次の質問をChatGPTにしました。

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

Blender(バージョン3.5)で、次の多数座標(X,Y,Z)にprimitive_cube(size=0.1)を生成するbpyスクリプトを教えてください。


(2, 2, 2)

(9, 6, 7)

(6, 3, 10)

(7, 10, 7)

(3, 9, 8)

(10, 7, 2)

(7, 2, 0)

(1, 8, 10)

(6, 7, 8)

(7, 9, 5)

(3, 4, 8)

(0, 2, 8)

(5, 0, 7)

(7, 7, 3)

(0, 6, 8)

(7, 2, 8)

(3, 2, 7)

(2, 0, 10)

(8, 5, 3)

(3, 5, 3)

(9, 10, 4)

(1, 9, 0)


以上

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

ChatGPTから次の回答をもらいました。

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

import bpy


# 多数の座標をリストで定義

positions = [(2, 2, 2), (9, 6, 7), (6, 3, 10), (7, 10, 7), (3, 9, 8), (10, 7, 2), (7, 2, 0), (1, 8, 10), (6, 7, 8), (7, 9, 5), (3, 4, 8), (0, 2, 8), (5, 0, 7), (7, 7, 3), (0, 6, 8), (7, 2, 8), (3, 2, 7), (2, 0, 10), (8, 5, 3), (3, 5, 3), (9, 10, 4), (1, 9, 0)]


# 各座標に対してprimitive_cubeを生成

for pos in positions:

    bpy.ops.mesh.primitive_cube_add(size=0.1, location=pos)

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


ChatGPTとのやりとり画面

このBlenderPythonスクリプトをBlenderで実行すると、期待どおりにCUBEが生成しました。


Blender画面

Blenderで得られたCUBEの面を一括で三角化し、さらに一括でマテリアルに赤色テクスチャ画像を貼り付けてからWabefront(.obj)ファイルとして書き出し、3DF Zephyr Liteに投入すると次のような画面となります。動画撮影や各種表現が可能です。


3DF Zephyr Lite画面

3 縦長数列をカンマで区切る横長式に変換するPythonスクリプト

遺物の3D座標はExcelで整理します。Excelから得られた座標値を取り出すと縦長数列になるのですが、それを横長式に変換するPythonスクリプトをChatGPTに問い、教えてもらいました。

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

改行で縦に長いAの数列を、「,」で区切られて横に長いBの式に変換する方法、あるいはPythonスクリプトを教えてください。


Aの数列

(2, 2, 2)

(9, 6, 7)

(6, 3, 10)

(7, 10, 7)

(3, 9, 8)

(10, 7, 2)

(7, 2, 0)

(1, 8, 10)

(6, 7, 8)

(7, 9, 5)

(3, 4, 8)

(0, 2, 8)

(5, 0, 7)

(7, 7, 3)

(0, 6, 8)

(7, 2, 8)

(3, 2, 7)

(2, 0, 10)

(8, 5, 3)

(3, 5, 3)

(9, 10, 4)

(1, 9, 0)



Bの式

[(2, 2, 2), (9, 6, 7), (6, 3, 10), (7, 10, 7), (3, 9, 8), (10, 7, 2), (7, 2, 0), (1, 8, 10), (6, 7, 8), (7, 9, 5), (3, 4, 8), (0, 2, 8), (5, 0, 7), (7, 7, 3), (0, 6, 8), (7, 2, 8), (3, 2, 7), (2, 0, 10), (8, 5, 3), (3, 5, 3), (9, 10, 4), (1, 9, 0)]


以上

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

ChatGPTの回答

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

A = [(2, 2, 2),

     (9, 6, 7),

     (6, 3, 10),

     (7, 10, 7),

     (3, 9, 8),

     (10, 7, 2),

     (7, 2, 0),

     (1, 8, 10),

     (6, 7, 8),

     (7, 9, 5),

     (3, 4, 8),

     (0, 2, 8),

     (5, 0, 7),

     (7, 7, 3),

     (0, 6, 8),

     (7, 2, 8),

     (3, 2, 7),

     (2, 0, 10),

     (8, 5, 3),

     (3, 5, 3),

     (9, 10, 4),

     (1, 9, 0)]


B = [a for a in A]

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

この回答を全部コピーしてPythonインタプリタにCtrl+Vで一括貼り付けして、Bをタイプすると、求める結果が表示されました。


Pythonインタプリタ画面

Excelで文字列結合により座標情報に「()」や「,」を加え、最初と最後に「[]」を加えた縦長情報をつくることができます。それを一括コピーしてPythonインタプリタに貼り付ければ、横長式に変換できることを知りました。

この操作の後、エディターで改行記号を一括削除すればもっと簡単であることに気が付きました。Pythonを使うまでもないことです。しかし、Pythonに親しむことが出来て、楽しい一時となりました。

4 感想

多数3D座標値にCUBEを一括生成する効率的な方法をChatGPTに教えてもらいました。200~300程度までの情報なら今までの手作業でなんとかなると思います。しかし、1000単位、あるいは10000単位の情報を扱うとなると、その効率的方法が必須です。その効率的方法開発の第1歩を踏み出すことができました。BlenderPython理解が趣味学習活動に必須であることと、ChatGPTがBlenderPython入門者の自分にとっての良きアドバイザーになることを体験しました。


0 件のコメント:

コメントを投稿