Blenderいじり /GeometryNode編(3)

GW中のGeometryNodeのお勉強は、とりあえず今回でおしまい。
最後に、TEXTオブジェクトを操作してみる。

ここでは、PositionやMaterialではなく、数字を表す文字列を変えて並べています。
奥にある107はFrame数なんだけど、これは後程。

TEXTオブジェクトをGeometryNodeEditorの画面にDrag&Dropすれば、ObjectInfoノードは生成されるけど、そこには文字列を指定するような入力がない・・・。

なので、力業で文字列を変えたTEXTオブジェクトを複数用意して並べてみます。

ひとつずつ文字列を編集して用意していきます。
#Attributeパネルに文字列を入力する欄がなくて、最初すこし迷いました。仕方なく、EDITモードに入って、Viewport画面で直接文字を入力していく。面倒くさいので20個程度まで。TESTなので・・・。

用意したTEXTオブジェクトはCollectionにまとめて、そのCollectionをDrag&Dropすると、CollectionInfoノードが生成される。これをInstanceOnPointsに接続して、あわせてInstanceIndex入力で数字を指定することで、実際に配置するObjectを選択できる。 

で、指定するInstanceIndexだけど、Indexノードを配置して直接入力しても思ったような配置になってくれません。仕方なく、Positionノードから自分が期待するような数値を算出してます。

[1] Positonから、x,y,zのVectorを取得。
[2] DotProductで、(1,0,0)を掛ける事でX座標の数値を取得。(0,1,0)をかけることでY座標を取得。
[3] X,Y座標の最小値(9.4499)をAddして、さらにこれもSpreaSheetから読み取った間隔(3.78)でDivideすることで、行数,列数を取得。ここから希望するIndex数を計算。
#最小値の9.4499はAttributeパネルから読み取ったもの。SpreadSheetから読み取った9.45だと誤差で途中の表示がずれる。

こんな面倒な計算が必要なのは、InstanceIndexに対して規則正しく並んでいないから。SpreadSheetエディタで調べてみると、こんな感じなので、仕方なく座標から計算。


ここまでは、複数種類のオブジェクトを、指定した順番で並べる方法
別にTEXTオブジェクトに限った話ではない。

せっかくなので、任意の文字列をTEXTオブジェクトに指定する方法を調べてみた。
下記のように、StringToCurvesノードを使えば、文字列(String)を指定して、Curveを生成できる。

最初の画像で奥に見えていた107がコレ。
Valueに#frameと入力してFrame番号の値を取得。ValueToStringで数値を文字列に変換、これをStringToCurvesに入力。画像だとCurveのままなので輪郭だけが見えてる。さらにFillCurveノードをGroupOutputの前に挟めば、内部をFILLしたMeshが出力される。
#ちなみに、GeometryNodeと関係なく、Layout画面での通常のモデリングで、BezierCurveで描いた輪郭をFILLする方法が当初わかりませんでした。3D Curveではなく、2DのCurveで閉じた形状にすれば、FillModeの選択で内部をFILLできました。

 

という訳で、表示したい文字のTEXTオブジェクトを事前に全部用意しておかなくても、意図したところに任意の文字形状を配置する方法は分かった。

過去に別のソフトで、並べたオブジェクトにそれぞれ名前を表示した事があったんだけど、同じことはできそう。

 

とりあえずGW中の、GeometryNodeのお勉強はここまで。
また具体的にやりたいことが見つかったら再開予定。

 

GeometryNodeの一覧をまとめたPageをみると、文字列を操作するNodeも用意されている模様。

qiita.com


GeometryNodeで文字列を基にCurveオブジェクトを生成する方法については下記のPageが詳しそう。さらに凝った事をやりたくなったら読んでみよう。

chan14.com