Houdiniでポリゴンモデリング part2

先日、ラピュタのロボットをHoudiniでモデリングしてみたが、
(http://www.serenelight3d.com/blog55/?p=3583)
今回は球体を使って様々な野菜やフルーツを作ってみた。

表面の模様や凹凸のディテールは、HoudiniのCOP内で
プロシージャルテクスチャを作成し、
ディスプレイスメントマッピングにより表現した。
今回、手作業によるペイントは行っていない。


今回、一番時間がかかったのはメロンの表面。

HoudiniのCOPは合成機能だけではなく、テクスチャーも作り出すことができるので
いろいろと研究の余地はあると思います。

Houdiniでポリゴンモデリング

今回、Houdiniでキャラクターモデリングを行ってみた。

一昔前だとHoudiniではキャラクターなどのポリゴンモデリングは厳しかったが
現在のHoudiniは必要なツールが一通り揃っているので、ある程度は問題なく行える。
(と、言っても、Houdiniでゼロからキャラクターをモデリングしている人は
そんなにいないとは思いますが…)

ポリゴンモデリングは主にラジアルメニュー(Cキーで表示)を使用して行った。
その場合、ほとんどのオペレーションはシーンビュー内で行うことになり、
ノードは自動的に作成され、自動的に接続されていく。

例えば、ポリゴンの押し出しやスプリットを使ってボックスから手の形を作成していくと
オペレーションのたびに対応するノードが自動的に作成され、
ネットワークに直列に接続されていく。

ロボットのゴーグルの穴はブーリアンを使用せずにモデリングで穴をあけた。
これはブーリアンを使用するとサブディビジョンの際に問題が出るため。

胸の紋章のモデリングは画像ベースで、VEXを使ったポイント移動によって行った。

今回、ラピュタのロボットをモデリングするために作られたノードは以下の通り。

そしてモデリング終了後にUV展開を行って、サブスタンスペインターでテクスチャーを作成した。
以下に示すように、HoudiniのUV圧縮を行うUV Layoutノードは非常に性能がいい。
今回は全てのパーツをまとめてテクスチャー作業を行ったため、テクスチャは4Kで作成した。

今回初めて本格的にサブスタンスペインターを使用したが、
Houdiniと同様に「プロシージャル」なフローでテクスチャー作成が可能になっており
とてもいいツールだと思う。
UIも最新バージョンで刷新されており、使いやすくなった印象を受けた。

最後にサブスタンスペインターからbasecolor,roughness,metal,normalマップを
エクスポートし、マントラでレンダリングを行った。

 

かわいいポーズ

可愛い写真が撮れた。
エルはよくこのポーズをとる。

最近は暖かくて過ごしやすい。
ずっとこの気候が続いてくれればな~

お花見

お花見に出かけた。
近くの公園ではほぼ満開。

菜の花も綺麗だった。

帰るとエルは爆睡中。
ハンモックのLサイズが欲しいな…

昼寝から起きた後、考え中のエル。

 

卒業進級発表会

学科の卒業進級発表会が行われました。

様々な学生作品が上映されましたが、
その中から投票で選ばれた上位3名には
学生作品のキャラクターが刻印されたクリスタルトロフィーが
贈呈されました。

受賞された方はおめでとうございました!

冬のエル

冬のエルは、床暖房の上で↓の格好で寝ている時が多い。
必ず「コ」の字の形になるが、
横になって寝る時の顔の向きは猫によって違うんだろうか。

Houdini RBD(リジッドボディ)

新年あけましておめでとうございます。
本年もよろしくお願いいたします。

冬休みにまとまった時間が取れたので
再学習も兼ねてHoudiniのRBD(リジッドボディ)アニメーションを作ってみた。

Houdini RBD personal study 03 from shuichi sakuma on Vimeo.

今回のシーンは通常のセッティングでは重すぎて最初計算が回らなかったが、
VEXを使うことでなんとか計算を回すことができた。

VEXは窓ガラス一枚ごとの粉砕・非粉砕状態のスイッチング、
建物のコンストレイン、RBDのアクティベーション、ガラス破片の初速度設定、
デブリ発生のタイミング制御など、様々な場面で使用している。

Houdini RBD personal work 03 wire view from shuichi sakuma on Vimeo.

一般に「ダイナミクス」というと、ツール側でほとんどやってくれそうなイメージがあるが
計算をうまく回すためのお膳立ての部分は、ハンドメイドで作成していくことになる。

Houdiniはポイント制御に始まりポイント制御に終わるツールなんだということを
今回改めて実感した。

エルは少し大きくなったのか
いつもの場所で寝ると脚がはみ出る。

猫にとっても秋は気持ちのいい季節なんだろうな。

8章のチュートリアル15(p372)に関しまして

現在刊行中の「Houdini SOP&VEX編」ですが
8章チュートリアル15の手順6(p372)を実行すると
Houdiniがクラッシュするケースがあります。

この現象はHoudini16のビルド600付近のバージョンで発生するようです。
お手数ですが以下のサイトから最新のビルド671以降を
ダウンロードして実行していただくと、クラッシュを回避することができます。
https://www.sidefx.com/download/

以上、お手数おかけしますがよろしくお願いいたします。

書籍「Houdini SOP&VEX編」に関しまして

お待たせしておりました拙著「Houdini SOP&VEX編」ですが
近日中に書店に並ぶ予定になっております。

 

お手数ですが書籍を購入された方は
ボーンデジタル社のサイトから以下のデータのダウンロードをお願いいたします。
(www.borndigital.co.jp/book/)

・書籍内チュートリアルで使用するモデルファイル、テクスチャーファイル
・書籍内チュートリアルの完成版hipファイル
・書籍内チュートリアルのVEXコードが記載されたテキストファイル

 

また、本書「Houdini SOP&VEX編」はSOP内で使用するVEXにフォーカスした
内容になっておりますので、DOPに関してはカバーしておりません。
その点ご承知おきください。

 

以下に書籍の正誤表を記載させていただきます。
こちらの正誤表は上記のボーンデジタル社書籍サポートページにも記載されております。
以上、ご迷惑おかけしますが、よろしくお願いいたします。

 

<8-4-13> (8章 p234)
————————————————————————————————

(誤)


// インスタンンス番号の決定
if(vmag > 3.5) {inst = 6+int(3*rand(@ptnum))};// 移動速度が速い猫
else if(vmag > 2.75) {inst = 3+int(3*rand(@ptnum))};// 移動速度が標準の猫
else {inst = 0+int(3*rand(@ptnum))};// 移動速度が遅い猫

(正)


// インスタンンス番号の決定
if(vmag > 3.5) {inst = 6+int(3*rand(@ptnum));}// 移動速度が速い猫
else if(vmag > 2.75) {inst = 3+int(3*rand(@ptnum));}// 移動速度が標準の猫
else {inst = 0+int(3*rand(@ptnum));}// 移動速度が遅い猫

 

<8-12-2-3> (8章 p342)
————————————————————————————————
書籍内VEXの”{0,0,3}”の部分を”{0,0,0.7+0.3*rand(@ptnum)}”に修正してください。

(誤) @v = {0,0,3};
(正) @v = {0,0,0.7+0.3*rand(@ptnum)};

 

<9-3-5> (9章 p544)
————————————————————————————————
手順5を終えたら、最後に【「Apply」ボタンを押す】操作を行って下さい。

 

<9-3-31> (9章 p557)
————————————————————————————————
書籍内エクスプレッションの”OUT_GLASS_PT”の箇所を”fuse2″に修正してください。

(誤) npoints(“../OUT_GLASS_PT/”)
(正) npoints(“../fuse2/”)

 

<9-3-40> (9章 p560)
————————————————————————————————
書籍内VEXの”OUT_GLASS_PT”の箇所を”fuse2″に修正してください。

(誤) int skip = npoints(“op:../OUT_GLASS_PT/”);
(正) int skip = npoints(“op:../fuse2/”);

 

<9-3-54> (9章 p567)
————————————————————————————————
書籍内VEXのchi(“../floorNum”)の後の”-1″を削除してください。

(誤) if(i@floor == chi(“../floorNum”)-1){
(正) if(i@floor == chi(“../floorNum”)){