Blender-3.0 でGeometry Nodesを見るだけ

 どうもazarasing(アザラシ)です。UEC19でMMAに所属しています。調布祭実行委員会にもいて、そこでオンラインの波に揉まれまくっていました。その過程で多少なりともBlenderに詳しくなったので、それ関連の記事を書くことにしました。どうぞよろしくお願いします。

adventar.org

この記事はUEC Advent Calender の23日目です。前回はクレイジーなピエロさんが書いてくれました。

cra2ypierr0t.hatenablog.jp

僕はまだ大学入りたての頃に「好きなイシは何?」と聞かれて何の裏も読まず「アメトリン」と答えたことがあります。まぁだからなんだっていう話なんですけどね。ケーキは絶対にミカンでつくってはいけません。もちろん理由はお分かりですね。

 

さて、この記事はDentoo.LT*1にて発表した内容の記事です。配信もされて、おそらくアーカイブも残りつづけるので、僕がたどたどしく発表している様子を見たい人、文字ばっかりの文章を読むことができなくなってしまった人はこちらを見ることをオススメします。

www.youtube.com

 

Blenderとは?

Blenderについて

Blenderとは?」と書いてみましたが、そもそもBlender知らない人がこの記事を真剣に見るとは思えないので軽く流すことにします。

Blenderとは、優しく言えば「ポリゴン形式などの3Dオブジェクトデータを操作することができるソフト」です。3Dのオブジェクトデータをいじくることができるので、モデリングはもちろんのこと、VFXなどの動画編集にも対応できます。最近公開された新エヴァでも、Blenderを活用したシーンがいくつもあるのが見て取れましたよね*2

さらにBlenderpythonAPIを提供しているので、pythonでのコーディングによってより幅が広がります。これについては前回参加したLTにて拙い発表をしました。

Meshを扱う

今回はより、ポリゴンであることを意識したBlenderの使い方がされています。3D空間上の物体をデジタルで表現する方法はいろいろありますが、Blenderにおいて主流といえるのはこのポリゴン;Blender上ではMeshと呼ぶものを使います。これははっきり言ってしまえば点の集合体です。この点の集合体に線や面を設定してやることで3Dのオブジェクトを表現します。この点の集合体であるということはどんな利点があるのかというと、行列としての演算ができることがメリットとして挙げられるわけです。

プロシージャルモデリング

行列としての演算ができて、何か利点があるのかという話ですが、あります

まあなければ記事として書かないんですが、例えば、同じ場所のメッシュに同じ処理を施したいと考えたり、あるいは何らかの規則性に則ってオブジェクトの模様を決定したいという需要が出てきます。これは、例えば原子の模型のようなものや、パイプのような連続体とみなせる構造、マンションやビルといった同じ窓や扉,柱などが存在するもの、更に無秩序に散乱した空き缶など、このようなものは人力で一つ一つ組み上げていくことでも実現することができますが、ある程度人が法則を決めてあげることでより変更に対応しやすく、かつ手間がかからない方法でこれらを実装することができます。

このような考え方を持ったモデリングをプロシージャルモデリングといいます。世の中には、法則性に縛られないものよりも、植物や建物、流体など何らかしらの法則に縛られるものが大半ですから、この考え方は自然なものといえるでしょう。これの先端を行くのは、Houdini*3というBlenderとは別の3DCGソフトであり、以前であれば、プロシージャルモデリングといえばHoudiniでしたが、Blenderもバージョン2.92からGeomtoryNodesという形でそれを実装しました*4。バージョンが3.0になってGeometryNodesはだいぶ改良されたものの、Houdiniよりはその性能はやはり劣るものではありますが、Blenderは初心者から気軽に触れる3DCGソフトとして多くのユーザーを持ちますから、その将来性に期待しつつ、こうして記事を認めているところなのです。

Blender3.0のGeometryNodes

御託はいいからさっさと内容見せろといわれるかもしれませんが、さっきの御託の中で僕は割と重要なことを書きました。それは結局行列計算なんだよっていうことです。つまり、行列をかけ合わせるときは行列の列数によっては掛け合わせることができなかったように、同じ列数、対応関係が明確に決定されていなければ演算は不可能ということです。つまり、各メッシュのポイントごとのインデックス関係が崩れれば、GeometryNodesは機能しなくなるということです。これを頭に入れないといけません。

Blender2.9.xのGeometryNodesには、それがきちんと明文化されておらず、あいまいに片づけていた部分が多くありました。これをわかりやすくする工夫が3.1.0-alphaには取り入れられています。次の画像をご覧ください。

f:id:azarasing:20211222230612p:plain

これは、Blender公式が出している画像*5です。

これを見てもらえばわかる通り、点線でつながっている部分と実線でつながっている部分に分かれているのがわかります。このように対象がそのMeshに対応しているかをより視覚的にとらえられるようにこのような対処が行われています。ここで重要なのは、これらの点線で与えられる値は各Mesh上のポイントで異なるのに対し、実線はこのGeometryNodesが走っているObjectに対して一意の値であるということです。

サンプルを見ていこう

Blenderでは公式のサンプルを配布しています。それを基にGeometryNodesがどのように変わったのかを見ていきましょう。今回見るのはFlowerScatteringとHalloweenSpiderです。これらのサンプルはいずれも以下のサイトで入手できます。

www.blender.org

FlowerScattering

このサンプルは文字通り、プロシージャルモデリングの花形ともいえるものです。詳しく見ていきましょう。

このように、ブラシで塗られた部分に花を生成するようなものになっています。この仕組みの主な部を抜き出したのが下の画像になります。
僕の方で注釈(オレンジ)を入れてみたので、それを見てください。

f:id:azarasing:20211222162107p:plain

表面のメッシュを基に、面の上にランダムにポイントを配置し、それをPoint Instanceによってその点ごとに花のオブジェクトを配置します。その過程で、大きさや向きについて乱数を生成してその結果を反映しています。大きさを決めるノードでは、完全なランダムではなく、ある程度重みが存在するNoiseTextureを使用することで、花ごとにクラスターを生成している様子を表現しています。

この画像及び説明を見て、うわーーーめっちゃ複雑そう..。と思った人も少なくないと思いますが、バージョン2.9ではもっとひどいものになっていました。

f:id:azarasing:20211222162722p:plain

この画像は僕がとある調布祭の企画にて実際に作ったノードになります。やっていることはFloweScatteringとあまり変わらないですが、これを見てもらうとわかるとおり、ノードが直列につながれており、どこがどういう機能を持ってつながっているのかが分かりにくいものになっています。

この状態ではあまりノードがもつ可読性を生かせていないばかりか、ただこのノードたちを一列ごとのコードに置き換えればよく、ただ機能のみを実装したのみという形状になってしまっています。この方がやりやすいという人間はいるかもしれませんが、あまりBlenderの層には響かないはずです。この点を解消し、並列に処理されたノードに関してもそのインデックス関係を崩さないように実装されている点が3.0から新しく加わった機能となっているのです。

Halloween Spider

さて次のサンプルを見てみましょう。

ご覧の通り、このサンプルではオブジェクトを動かすことでそれに追従した動きをこの連邦に反省を促しそうな彼が行います。このノードの足の部分の動きについて主な部分を見てみましょう。

f:id:azarasing:20211222165505p:plain

Blender3.0にて新しく追加されたGeometry Proximityによって、地面を構成するメッシュの内、指定した座標に近いポイントを抽出し、その座標を出力するようなノードとなっています。

このノードによって出力された座標を終点とするようなカーブを生成することがBlender3.0から新しくできるようになった*6ので、それを用いてCurveの始点と終点をGeometryNodesで決定することで、まるで足がぐにょぐにょ動いて、歩いているように見えるという仕組みになっています。また足の形状を変更することができ、〇で囲った部分のグラフからカーブの位置ごとの半径を決定しています。

まとめ

このように進化したBlenderですが、今後どのようになっていくのでしょうか。このGeometryNodesの機能ですが、現状ではBlender上のみで動くものとなっており、外部;例えばUnityなどに持ち出す場合には、いったんこのGeometryNodesの生成を「焼き付けた」状態*7で出力しなければなりません。これではUnityなどの外部側での調整に少し手間が生じてしまいます。将来的にはこの点を解消し、GeometryNodesで設定した様々な閾値に関してはUnity側の調整が可能になるような変更が加わるのではないでしょうか*8。こうなれば、Houdiniなどの優位性は残るものの、多くのユーザーを持つBlenderをUnityの3D作成外部ツールとして本格的に導入するところが増え、Blenderの天下が訪れるのではないかと妄想しています。

兎にも角にも、今後もBlender財団には頑張っていただきたいです。

 

さて、次回のAdventはついに、われらが主催のmaccha氏による記事です。あぁーほんと楽しみですね!どんな記事が出るんだろう…むっちゃドキドキしてきた…電通大生の皆さん、今日ぐらいはゆっくり休んで明日の記事に備えますよね!

そんな魅惑の記事はこちらです!

macchanism.hateblo.jp

*1:

dentoolt.connpass.com

*2:
シンエヴァンゲリオンなどを制作するスタジオカラーBlenderに制作環境を移行させることを明言し、さらにBlender開発基金への賛同もしています。

www.khara.co.jp

*3:LT中ずっとホウディニって呼んでます。まぁ外来語だから何でもいいよねキット!

www.sidefx.com
あと、ほんとにHoudiniは高いです。高すぎです。自分は買えないので、誰かおごってください。

*4:

www.blender.org

*5:

www.blender.org

*6:正確には、MeshをCurveに変更するノードを利用しています。他にもCurve関連のノードがBlender3.0にて追加されているのでチェックしてみてください

*7:Ctrl+AからVisual Geometry to MeshかMake Instances RealをGeometryNodeの形式によって選択します。今回の場合、FlowerScatteringは後者、HalloweenSpiderは前者を選択すればいいはずです。いずれにしても、この処理を行うことでGeometryNodesによる細かな変更ができなくなります。

*8:先ほど話に出たスタジオカラーは、BlenderとUnityとの連携を求める発言をしています。

japanese.engadget.comスタジオカラー基金に出資しているので意見等を取り入れさせる機会を持つことができ、インタビューでこのように語っている点は将来、Unityとの連携性をより高め、例えばUnityのコンポーネント内でそれがいじれるようなAssetsをBlenderが提供し始めるようになるかもしれません。
USD Importerの強化も今バージョンにて行われ、Unreal Engineとの連携は優位になっているように見えますが、まだまだHoudiniの手助けは必要です。