bpyを用いてグループ出力を取得する方法について解説します。まだまだ勉強中なので、誤り等ありましたらコメントでご指摘ください。
目的
Blenderのジオメトリノード機能で作成したオブジェクトのグループ出力をpythonスクリプトで取得したい。
環境
Blender 4.0 Beta
Python 3.10.13
取得方法
エディタ上での準備
取得したい情報をジオメトリノードのグループ出力につなぐ。
スクリプトからアクセスするために、出力にAttribute(属性)を割り振る。
プロパティエディタ>ジオメトリノードモディファイアー>出力属性から取得したいデータにAttribute名をつける(画像だと'rotation')。
スクリプト
以下のスクリプトでグループ出力が取得できる。この例では、'rotation'の出力を取得している。
なお、Blenderのpythonでprint()
を使用するためには、Blenderをコマンドプロンプトから起動する必要がある(コマンドプロンプトを経由せずに起動してprint()
を使用した場合、Blenderが落ちることがあるため注意)。
import bpy
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
rotation_vector=mesh.attributes['rotation'].data[0].vector
print(rotation_vector)
出力
<Vector (0.0000, 0.0000, 1.4897)>
解説
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
でモディファイア(この場合はジオメトリノードモディファイア)が適用されたオブジェクトを取得し、to_mesh()
を用いてオブジェクトに紐づけされたメッシュを取得する。
rotation_vector=mesh.attributes['rotation'].data[0].vector
mesh.attributes['rotation'].data
で各頂点のrotationのリストを取得する。data
のインデックスは各頂点のインデックス番号と対応している。
今回取得したいデータはベクトルなので、メンバ変数のうちvector
を見ることで、rotationのベクトルが取得できる。
自分用の覚書
今回ジオメトリノードのグループ出力を取得する方法を調べる際に使用した手法を自分用に残しておく。
rotation_vector=mesh.attributes['rotation'].data[0]
からどのようにベクトルを取得したらいいかわからなかったため、以下のスクリプトを用いて、rotation_vector=mesh.attributes['rotation'].data[0]
に入っているオブジェクトのメンバを確認した。
import bpy
obj = bpy.context.object.evaluated_get(bpy.context.evaluated_depsgraph_get())
mesh = obj.to_mesh()
data = mesh.attributes['rotation'].data[0]
for p in dir(data):
print('%s: %s,\n' % (p, getattr(data,p)))
出力
__doc__: None,
__module__: bpy.types,
__slots__: (),
bl_rna: <bpy_struct, Struct("FloatVectorAttributeValue") at 0x00007FF7D21488C0>,
rna_type: <bpy_struct, Struct("FloatVectorAttributeValue") at 0x00007FF7D21488C0>,
vector: <Vector (0.0000, 0.0000, 1.4897)>,
参考
https://blenderartists.org/t/accessing-spreadsheet-data-with-python/1367634/6
https://twitter.com/yukimituki11/status/1436955560612544517