アトリビュートの入力
何か数値データがあって、それをもとに何か作れないかなって思った時、Geometry Nodesに外部から値を渡す方法は何かあるのか?って考えます。その一つの方法に頂点に値を持たせておいてそれをGeometry Nodesで利用するってことがあるらしい。
日本の新型コロナの感染者数のグラフを作ろうって時、例えばNHKのサイト(新型コロナウイルス データで見る感染状況一覧[nhk.or.jp])でデータを配布しているのだけど、そこから落とせる「国内の感染者数」のcsvファイルから毎日の感染者数を得ることができます。で、これを書いている日は最初の感染者が記された日から702日目までのデータが入っているから、横方向に702個の頂点のあるグリッドを用意します。下図の文字は701×1が正解。
で、このグリッドの頂点にカスタムのアトリビュートを設定し、各頂点に感染者数の数字を持たせました。(参考ってかコピペ:Custom vertex attributes/data - Coding / Python Support [Blender Artists Community])
import bpy me = bpy.context.object.data layer = me.vertex_layers_int.new(name="layer_int") src = "1,0,0,0,(省略するけど702日分の数字をカンマ区切りで書いてある)" infectionNumbers = src.split(",") for i in range( len(infectionNumbers) ): layer.data[i].value = int( infectionNumbers[i] )
結果、このグリッドにはカスタムアトリビュート layer_int が作成されます。
あとはこのグリッドにGeometry Nodesを設定し、以下のようなツリーを構築。Object Inputでそのカスタムアトリビュートを読み込んでやるだけです。
この結果、以下のようなグラフを得られました。
ただ、これは不完全で、本当ならポイントの発生源をポリゴンの中心からにしてあげるといいのだろうし(どうやるんだろう?)、頂点から生やすこの方法でやるなら、必要のないポイントは削除してやる必要がありますね。もっと言えばスクリプトを走らせるのなら必要ポイントだけのオブジェクトを作ればいいのかもしれない。だからこの方法そのままじゃ実用性は薄いけど、一つ勉強したということで今日は満足しておくこととします。