見出し画像

Vellumのこともっと知りたい

Houdini Apprentice Advent Calendar 2023 の記事になります!


記事内容の導入、きっかけとして

モデリング用途としてHoudiniを触り始めたのもあり、シミュレーション系のノードに苦手意識があります(というか、全然上手く扱えていない)。
苦手意識の大きな原因として、根本の仕組み部分への理解が甘く、上辺だけをすくって何とか理解した気になっているなあと反省があったので、もう少し深掘りする必要があると思ったのが本記事の趣旨となります。
特に海外系のチュートリアルは英語がわからないこともあり、画面に映るノードの操作・組み合わせだけを覚えていたのが本当に良くないなと……。

シミュレーション系だと始めに触るノードとしてパーティクル(POP)か、RBD (Rigid Body Dynamics)、Vellumあたりかと思いますが、今回はVellumを少しだけ深掘りしてみようと思います。
※基本的に自分が書く内容は紹介する記事や動画の受け売りです。

PBD (Position Based Dynamics) と Constraint(制約)の2つが大事そう

Vellumとは、拡張されたPosition Based Dynamicsの手法を使用したシミュレーションフレームワークです。

https://www.sidefx.com/ja/docs/houdini/vellum/overview.html

とりあえずは公式のドキュメントから読みはじめました。
読んでいくと上に引用したようにPBDへの理解が必要そうな言葉が書かれています。また、ドキュメントや各種チュートリアルで頻繁にConstraintという単語が出てくるので、これも重要そう(主観)。
結果的にもこの2つの理解が自分にとっては大事だったので、この2つをメインに紹介します。

PBD (Position Based Dynamics)

名前通り「位置ベースの物理シミュレーション」のことらしいです。
今までのシミュレーションが物理法則に則って計算処理をしていたところを数学的なアプローチで処理することで高速化しているとのこと。
欠点として物理的な正確性に欠けるので、何度も同じ計算をすることで結果を収束させる必要があるとのこと。
自分は下記の2つを元に大枠の理解をした感じです。

完全な理解までは到底及ばなかったものの、ここの概念を何となくでも理解したおかげで Vellum Solver の iteration や substeps の回数を何故増やすのか?(そして精度が何故上がるのか?)の理由がわかったのが非常に良かったです。

Constraint(制約)

PBDでポイント(vertex)ごとの計算をするだけだと自由気ままに発散してしまいます。そこで「ポイント同士に何らかの制約を設けることでより複雑なシミュレーションができるのでは?」という発想がConstraintになります。
調べた所感として、Vellumを扱う上で「Distance拘束」と「Bend拘束」の2つが重要かなと思いました。

Distance拘束、Bend拘束

Vellum Constraintノード上はそれぞれ「Distance Along Edges」と「Bend Across Triangles」という名前です。この2つを組み合わせた設定が頻繁に使うであろう「Cloth」だったりと、他の拘束タイプも上記2つの発展型と言えると思います。

Constraintのタイプが多すぎる……

Distance拘束もBend拘束も説明してしまえば非常に簡単な話で、下記の画像の説明の通りです。Distance拘束は距離を制限し、Bend拘束は角度は制限するというシンプルな話。

実際の設定画面はVellum Constraintsノードの「Stretch」と「Bend」の項目になります。ここのStiffness(剛体)の数値を大きくするほど制約が強くなるので、より硬い物質のような挙動をします。
この2つの項目(もしくは片方)はほぼ全てのConstraintタイプの設定で必ず出てくるので、ここのイメージが何となくあるだけでも最終的なシミュレーション結果がイメージしやすくなるのはないでしょうか。

チュートリアルでもここのStiffnessとRest Length Scaleをいじることが多いですよね

上記の説明は下記の動画の冒頭で説明されていたこととほとんど同じなので、下記の動画を見るとより理解が深まります(英語ですが頑張って翻訳して見る価値あると思います)。

発展形として

上記のConstraintの考えから発展させてSoftbodyのような表現ができたりします。これも基本は同じで、どういったConstarintを設定するかの違いになります。
Softbody系だとポイント同士の対角線上であったり、メッシュの内部により複雑なConstraintを設定することで実現できます。
下記サンプルとして右が「Vellum Configure Strut Softbody」で、左が「Vellum Configure Tetrahedral Softbody」で設定したものになります。
Constraintの設定の違いで潰れ方も結構違いますね。

この他に流体表現もVellum(Grain)でできたりしますが、根本の考え方は同じかと思います(ポイント同士の制約をどのように設けるか)。
「Vellumってクロースシミュレーションだと思ってたけどなんで流体表現までできるんだ??」と思っていましたが、この辺の根本を理解すると何となく出来そうだなという感覚までは行けたかなと。

ちなみにVellum softbodyのチュートリアルとして下記は結構良かったです。この辺の根本の説明もしてくれてイメージしやすい。というか、下記はシリーズ動画で他にもあるのですが基本的に全部良かった。

終わりに

ノードベースのツールって深く理解せずともノードを繋げるだけで何となく動くのが個人的には魅力で好きな部分ではあるのですが、やはりどこかのタイミングで根本を理解しないと頭打ちになるなと今回の件で痛感しました。

面倒くさがらずに基礎をちゃんとやる必要がある……基礎が大事……。

いいなと思ったら応援しよう!