Vellumを使用した拘束のアプローチを紹介します。
TEXT_秋元純一 / Junichi Akimoto(トランジスタ・スタジオ/ディレクター)
日本でも指折りのHoudini アーティスト。
手がけてきた作品は数々の賞を受賞している。
代表作に、HIDETAKE TAKAYAMA『Express feat. Silla(mum)』など。
www.transistorstudio.co.jp
blog.junichiakimoto.com
EDIT_小村仁美 / Hitomi Komura(CGWORLD)
Vellum Constraint
前回に引き続き、今回もVellumを紹介していきたいと思います。Vellumは拘束な弾性体のシミュレーションが可能ですが、その高速さから様々なセッティングを試すことが容易にできます。今回は、Vellumが表現可能な中でも面白く、今までのHoudiniでは難しかった表現にチャレンジしていきたいと思います。
まず大きなパーツとして、バルーン状のものを作成していきます。さらに、それをロープで拘束するような表現をしていきたいと思います。どちらの表現もVellumで行うことで、かなりシンプルなセッティングでシミュレーションまでたどり着くことが可能です。
Vellumの特徴として、衝突判定はあくまでもParticleベースで行い、それらをConstraintで結びつけるようにすることで、様々なマテリアルを表現できることがあります。そのため、衝突判定自体が非常に高速であること、Constraintのセッティングがあらかじめ多数用意されていることもあいまって、非常に手軽にセットアップすることができます。また、バルーンやロープもVellum同士でシミュレーションすることで、さらに簡略化することができます。今回は、2つの要素を混ぜてシミュレーションする際のアプローチにも注目してください。
今回のHoudiniプロジェクトデータはこちら01 Balloon Source Setup
バルーンソース作成のフローを解説します。
まず、バルーン状にするジオメトリを準備します。ベースとなるジオメトリを準備したら【A】、VDB from Polygons SOP【B】を使ってVDBのSDFへ変換します【1】。これをVDB Reshape SDF SOP、VDB Smooth SDF SOPを使ってある程度なめらかにして、PolygonへConvert VDB SOPを使ってコンバートします【C】。これによって、ある程度ディテールが除外されて、シミュレーションの邪魔になる細かな突起などをなくすことができます【2】。
次に、Remesh SOP【D】を使って、均一なPolygonへ変換します【3】。この工程は、Vellumをきれいに、低コストでシミュレーションするために重要なポイントです。無駄なディテールはシミュレーションの邪魔になるばかりでなく、高コストになるだけで、あまり良い結果を得ることができません。当然、シワなど、シミュレーションでできるディテールが欲しい場合はRemeshの時点である程度細かくするなどの対応は必要ですが、ある程度均一なPolygonになっているに越したことはありません。最後に、この工程が重いようなら、File Cache SOP【E】などで中間キャッシュをとっておきます。ジオメトリの準備ができたら、初期位置へレイアウトしておきます【4】。
02 String Source Setup
今回、拘束用の紐は、レイアウトしたジオメトリからプロシージャルに生成できるようにセッティングします。まず、VDB【A】を使って、ベースのジオメトリを包むような形状へ調整します【1】。次に、そのPolygonをReduce SOP【B】を使って、紐をイメージしながら数を調整します。PolygonのEdgeが紐になるイメージです【2】。
これをConvert Line SOP【C】でPolygon Lineに変換して、Resample SOP【D】でPointを追加します。また、それぞれ離れているPointをFuse SOP【E】でつなぎ合わせます。これがバルーンを拘束するための紐になります。次に、ReduceされたPolygonをGroup SOP【F】のNormal方向で、-Y方向を向いているPointを抽出します【3】。このPointに対し、For Loop【G】を使って段階的にくっついていくようなアプローチで、最終的に数箇所にまとまるようなしくみを作ります【4】。
ここは複雑なので、参考データをよく確認してもらうのが良いと思いますが、垂直に下におろしても問題はありません。見た目的な問題でこのようにしています。このPointをAdd SOP【H】を使ってつなげ、Resample SOPやConvert SOP【I】などをつかって、なめらかなカーブに変換します【5】。
Group Expression SOP【J】をつかって、今作ったカーブの最初と最後のPointをグループにします。最後に、Fuse SOP【K】を使って、網状の紐と垂直の紐をつなげます。Fuse SOPでつなげる際に、Pointが交差する箇所をグループにしておくと、後で結び目を作成する際に役立ちます【6】。
[[SplitPage]]
03 Vellum Flow
ソースの準備が整ったら、Vellumのセッティングに入ります。まずはバルーンから設定していきます。Tab MenuにはVellum Configure Balloonという設定があらかじめ存在します。これは、Vellum Constraint SOPを2つ使ったものです。
1つ目【A】は外皮をClothの設定にしたもので、Stretchの値を低くもたせることで、ゴムのような伸縮性を表現します。2つ目【B】はPressureを設定したもので、これはすべてのPointをひと続きにつなげたもので、全体で1つのConstraintにしています。こうすることで、全体に均一に圧力を分散するようなしくみをとっています。
この2つのConstraintを組み合わせることで、風船状の表現を可能にしています。次に紐の設定です。こちらはVellum Configure SOP【C】で、Constraint Typeの設定をStringに設定しています。こうすることで、カーブ全体でを紐状のConstraintを作ることができます。同じような設定にHairがありますが、それはこの設定だとFuseしたPointがバラけてしまうので、今回はStringを使用しています。
2つのVellumをVellum Solver SOP【D】へつなぐ際、GeometryとConstraintはそれぞれ別のMerge SOP【E】でつなぐ必要があります。種類が違うのでこのようにする必要があるのですが、もし1つのMergeでつなぎたい場合、Vellum Pack SOPを挟むと解決します。ただ、その後はVellum Unpack SOPでバラす必要があるため、シチュエーションに応じて選択してください。
Vellum Solver SOPの内部では、POP Force DOP【F】を使って、風船に対してだけ浮遊する力を加えています。逆に、紐にだけは重力を加えています【G】。数値は、浮力に対してほど良くなるように、お互いを調整し合います。また、Vellum Constraint Property DOP【H】では、pressureのConstraint【1】にだけ、Rest Length Scale【2】の数値を高くして、膨らむように調整します。
ここには、アニメーションも組み込むことができます。これでVellum I/O SOP【I】でキャッシュを取り完成です【3】。また、Vellum Post Process SOP【J】では、Stretch Stressなどを可視化することも可能です【4】。
04 Render Geometry
最後に、レンダリング用のジオメトリを準備します。今回のように、実際のジオメトリをプロキシ化して簡略化したシミュレーションの場合、最終的なものに戻す必要があります。Houdiniではそういった方法は多数存在していますが、今回は最も簡易的に行える方法として、Point Deform SOP【A】を使用したアプローチを紹介します。
これは、元のジオメトリをシミュレーション前のプロキシジオメトリでキャプチャして、シミュレーション後のジオメトリの形状に変形させるというものです。プロキシジオメトリ自体のトポロジーは同一であることが条件なのと、形状に大きな差がないことが求められます【1】。今回のようなケースでは問題なく変形が行えるかと思います。また、Point Deform SOPは、Wrangleベースの設計になっており、非常に高速です。
次に、StringのVellumの結果をロープ状にします。これは、カーブそのものをPolygonメッシュの状態に生成し直します。今回は、Polywire SOP【B】を使って、カーブに直接厚みをつけます。また、あらかじめ用意しておいた結び目【C】を、Fuseする際に作成しておいたGroupの箇所にCopy【D】などを使って配置します【2】。
これらを合わせてロープの完成です【3】。最後に、めり込みなどが目立たないか確認して完了です【4】。
[[SplitPage]]
05 Operators
主要ノードを解説します。
●Vellum Constraint Property DOP
今回紹介するノードは、Vellum Constraint Property DOPです。
このDOPノードは、VellumのSolve中に、Constraintsの共通プロパティを変更することができます。ここが重要で、通常ConstraintsはSOPで生成したものをDOP内に読み込んだ際、初期フレームの値が引き継がれます。そのため、途中で値を変更したりする場合、Geometry VOP DOPなどで、Data BindingをConstraintGeometryに対して行い、値を変更する必要があります。通常はセットアップがややこしいのですが、このオペレータを使うことでそれらを簡略化して行うことが可能になります。新たにConstraintsを作成することはできませんが、Constraintsの削除は行うことが可能です。
シミュレーション中に固くしたり、柔らかくしたり、縮めたり伸ばしたり、そういったことを簡易的に行えるものですが、より詳細なアクセスをする必要がある場合は、このしくみを基にカスタマイズする必要があります。Vellumでは、ConstraintsのプロパティはAttributeに紐付いているため、DOP内でも変更することが可能になっています。
より細かい調整の足がかりとして、最初に知っておくべきオペレータのひとつだと思います。
-
「Houdini COOKBOOK +ACADEMY」
Houdiniを基礎から楽しく学ぶオンライン講座
公開日程:毎週金曜日公開(予定)
価格:1,200円(税込)
※第一回「Houdiniの基本概念とインターフェイス」は無料公開中
受講対象:Houdiniをこれから学びたい方、Houdiniの勉強で挫折した方など
cgworld.jp/special/houdinicookbookacademy