0
0

BlenderとPythonでジオメトリノードのグループ出力を取得する方法

Last updated at Posted at 2023-11-14

bpyを用いてグループ出力を取得する方法について解説します。まだまだ勉強中なので、誤り等ありましたらコメントでご指摘ください。

目的

Blenderのジオメトリノード機能で作成したオブジェクトのグループ出力をpythonスクリプトで取得したい。

環境

Blender 4.0 Beta
Python 3.10.13

取得方法

エディタ上での準備

取得したい情報をジオメトリノードのグループ出力につなぐ。

グループ出力.jpg

スクリプトからアクセスするために、出力にAttribute(属性)を割り振る。
プロパティエディタ>ジオメトリノードモディファイアー>出力属性から取得したいデータにAttribute名をつける(画像だと'rotation')。

モディファイア.jpg

スクリプト

以下のスクリプトでグループ出力が取得できる。この例では、'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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0