見出し画像

Houdiniのプロシージャルモデリングの仕組み ー あるいはMayaのヒストリーはなぜ壊れるか?

大げさなタイトルですが、Houdiniを触ると最初の数日で気がつきそうな話です。そのつもりで読んでください。

Houdiniはプロシージャルモデリングに強いとよく言われます。それは一体どんな仕組みがあるからなのでしょうか?
まずは逆説的に、Houdiniで非プロシージャルな作り方をやってみます。

Houdiniで非プロシージャルに作る

円柱の一部の領域を押し出して、カリン塔のような形を作りたいと思います。

円柱を作り…
ポリゴンを選択して…
押し出し!

簡単ですね!
ノードベースとはいえ、ノード名も親しみやすいものばかりで、Mayaとほとんど違いがないように見えます。

しかしこのような作り方ではHoudiniと言えど、円柱の断面の分割数を増やすと塔のてっぺんが欠けてしまいます。

上の面が欠ける

Houdiniでプロシージャルに作る

次に、もう少しだけ、Houdiniらしい作り方をしたいと思います。

円柱に対し、ポリゴンを選択するのではなく、
Groupノードを作り、バウンディングボックスを設定します。
そのGroupに対してPolyExtrudeをかけます。
この方法であれば、円柱の断面の分割数が増えても
上の面がかけることはありません。

この違いは何かというと、最初の作り方はポリゴンの番号を直接指定しているのに対し、次の作り方はポリゴンのあるべき範囲(バウンディングボックス)だけを設定していることに尽きます。

手動での選択はポリゴンの面番号の直接指定になる

「Houdinistはポリゴンを直接選択しない」とよく言われますが、直接選択しないことにはこのような利点があるからなのですね。
では次にMayaで作ってみて、その違いを比較してみましょう。

Mayaで作る

Mayaでも円柱を作成し…
ポリゴンを選択して…
押し出します。
ヒストリーをいじって円柱の分割数を変えると、
Houdiniの最初の例と同じように、塔の一部がかけてしまいます。
(押し出し面が移動するのはMayaは蓋のほうが面番号が小さいため)

なぜ押し出しの大きさがずれるかというと、これはMayaのPolyExtrudeが、Houdiniの直接選択と同様にポリゴンの面番号を直接指定しているからなのです。
ヒストリーをみると、polyExtrudeFacetというコマンドがあり、その末尾でポリゴンの面番号を直接指定しています。

polyExtrudeFacet -constructionHistory 1 -keepFacesTogether 1 -pvx -1.192092896e-07 -pvy 0.5000000745 -pvz -1.788139343e-07 -divisions 1 -twist 0 -taper 1 -off 0 -thickness 0 -smoothingAngle 30 pCylinder1.f[81:85];

※ pCylinder1.f[81:85] の部分がそうです

残念ながらMayaのpolyExtrudeFacetコマンドには、面番号を直接入力するしか手立てがありません。HoudiniのGroupノードのような空間中の範囲選択や、向きでの選択で押し出す事はできないのです。

俗にMayaのヒストリーは壊れて役に立たないのですぐに消せと言われます。しかし、壊れた/壊れていないというのは人間の勝手な判断で、Mayaのヒストリーはこの仕組みの中で正しく動いています。
PolyExtrudeはポリゴンの番号に対して押し出しているんだな、そもそもの面番号が変わるようなヒストリーの操作をすれば、そりゃずれるよな…ということを理解すればMayaとの付き合いもうまくなりますし、その思考法は『プロシージャルなモデリングへの第一歩』です。

ぼくはできるだけ新人にも、ヒストリーは壊れるので消せといった教え方ではなく、なぜこのように動くんだろう?と考えるような教え方をしたいと思っています。
今回の記事は、実際に新人に話してみて、反応が良かったので書きました。

最後に、もう少しだけHoudiniらしい作り方に直したいと思います。二番目にお伝えした方法は押し出すポリゴンの範囲を空間で指定していましたが、その方法だと円柱の太さそのものが変わったときには対応できません。
選択範囲をメッシュで作り、MachSizeを使って選択範囲のメッシュが円柱の大きさに常に一致ようにすればその問題も解決できます。

選択範囲をメッシュで作り、円柱の太さとリンクした

選択範囲もプロシージャルに作れるとういうのがHoudiniらしい面白さですね!

この記事が気に入ったらサポートをしてみませんか?