Houdiniのプロシージャルモデリングの仕組み ー あるいはMayaのヒストリーはなぜ壊れるか?
大げさなタイトルですが、Houdiniを触ると最初の数日で気がつきそうな話です。そのつもりで読んでください。
Houdiniはプロシージャルモデリングに強いとよく言われます。それは一体どんな仕組みがあるからなのでしょうか?
まずは逆説的に、Houdiniで非プロシージャルな作り方をやってみます。
Houdiniで非プロシージャルに作る
円柱の一部の領域を押し出して、カリン塔のような形を作りたいと思います。
簡単ですね!
ノードベースとはいえ、ノード名も親しみやすいものばかりで、Mayaとほとんど違いがないように見えます。
しかしこのような作り方ではHoudiniと言えど、円柱の断面の分割数を増やすと塔のてっぺんが欠けてしまいます。
Houdiniでプロシージャルに作る
次に、もう少しだけ、Houdiniらしい作り方をしたいと思います。
この違いは何かというと、最初の作り方はポリゴンの番号を直接指定しているのに対し、次の作り方はポリゴンのあるべき範囲(バウンディングボックス)だけを設定していることに尽きます。
「Houdinistはポリゴンを直接選択しない」とよく言われますが、直接選択しないことにはこのような利点があるからなのですね。
では次にMayaで作ってみて、その違いを比較してみましょう。
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らしい面白さですね!