カテゴリー別アーカイブ: houdini

Houdini ノイズ関数

<ノイズ関数についての備忘録>

Houdiniには複数のノイズ関数が用意されているが
その効果の違いを確認するため
振幅、周波数、オフセットパラメータなどを全て同じ値にして
代表的なノイズ関数を比較してみた。

それぞれディスプレイスマッピングのレンダリング画像と
ベクトルフィールドの結果になっている。
(worleyノイズのみ距離を返す関数のためスカラフィールド)

 

ディスプレイスマップのノイズパラメータは
以下のデフォルト値を使用した。
(worleyノイズのみ周波数1に設定)

■周波数:10 10 10
■オフセット:0 0 0
■振幅:1
■粗さ:0.5
■減衰:1
■乱流:5

 

オリジナルの状態(Sphere SOPで作成した球体)

normal

 

 

◆originalperlin noise

originalperlin

originalperlin2

標準的なノイズ関数。
近傍との連続性を維持しながら全体的に均等なノイズがかかる。

 

◆alligator noise

alligatornoise

alligatornoise2

領域ごとにノイズのかかり方に共通性が現れる。
ディスプレイスメントマップではそれが細胞状の隆起となって確認できる。

 

◆simplex noise

simplexnoise

simplexnoise2

ノイズのかかり方は比較的緩やか。
領域によるノイズの変動も小さい。

 

◆sparcecovolusion noise

sparcecovolusionnoise

sparcecovolusionnoise2

領域ごとに特定方向に大きなうねりを作る。
うねりごとの領域面積にはばらつきが見える。
ノイズ関数の中では見た目の変動が一番大きくなる。

 

◆worley noise

worley 2016-06-27_110055

ポアソン分布に従ってばら撒かれたポイントまでの
距離を返す関数であるため、alligator noiseと同様に
領域ごとにノイズのかかり方が異なり、その見た目は細胞状になる。

Houdini 薔薇

HoudiniのForEach SOPの応用例として
薔薇のモデリングを行ってみた。

今回、モデリングだけで終了するはずだったが
Houdiniのクロス機能を組み合わせて
枯れていくシミュレーションも作ってみた。

HoudiniのクロスはPointWrangle SOPと組み合わせて使うことで
衣服に縛られず様々な表現に使用することができる。

なんで今回薔薇かと言うと
最近ディズニーの「美女と野獣」の予告動画を観たので…

 

Houdini Rose animation test v001 from shuichi sakuma on Vimeo.

 

Houdini Rose animation test v002 from shuichi sakuma on Vimeo.

 

薔薇に見えるように花の部分はシナモンロールをイメージして作った。
(そーいえば最近食べてないな)

2016-06-19_212347s

SOPネットワーク。

2016-06-19_211906

 

 

 

教科書「Houdini SOP&VEX編」完成

 

教科書「Houdini SOP&VEX編」がついに完成した。

 

2016-03-20_084602

 

1年がかりで執筆していた教科書。
最終的に全522ページ、オールカラー、A4サイズの書籍となった。
持った感じは辞書レベルの重さ。

2016-03-17_144018

2016-03-17_144537  2016-03-17_144154 2016-03-17_144220

 

教科書タイトルにもあるように、この書籍は全編オールSOP&VEXの内容で構成されており
一貫して「プロシージャル」というテーマに沿った内容になっている。
書籍ではSOP4割、VEX6割程度の内容になっている。

また、この書籍は学校で使用する教科書になるため、Houdiniの本質を理解するためにも
シェルフは極力使用せず、オペレーターを一から作成していくスタイルをとっている。

さらに今回、アルゴリズムを解説し、それを実際にVEXを使って実装していく章なども盛り込んだ。
VEXを使用する上で重要になってくる数学理論にもかなりのページを割いて解説している。

2016-03-17_1443372016-03-17_1442372016-03-17_1442512016-03-17_144304

 

SOPを理解するためには本の中でいかに良質なチュートリアルを揃えるかが
重要になってくるため、チュートリアルに関しては今回かなりの分量を準備した。
(計17チュートリアル)

2016-03-17_1441342016-03-21_070259 2016-03-17_144121  2016-03-17_144406 2016-03-17_144505 2016-03-17_1444492016-03-17_1440402016-03-17_151444

 

さらにVEXやSOPの章では使用頻度の高いオペレーターや関数をカテゴリー別に分けて解説した。
その際、わかりやすいサンプルコードやサンプルネットワークを付けて解説するように心がけた。

2016-03-17_1453182016-03-17_144357

 

今回は26部しか作らないらしいが(自分のクラスの学生分)
需要があれば、いずれ外部向けにも出版したいと考えている。

ちなみに、この教科書は4月から日本電子専門学校の
CG研究科2年生の授業で使用していきます。

Houdini L-system

最近またHouidiniのL-systemを触っている。

L-systemを使えば再帰ループよって様々な植物モデルを
文字コードの羅列で作成できる。

文字コードには以下の様なものがある。

F 枝を伸ばす
& 枝のX軸回転
/ 枝のY軸回転
+ 枝のZ軸回転
“ 枝の伸長率
! 枝の太さスケール
; 枝の回転スケール
T 重力
[] 新しい枝に分岐
~ 枝のランダム回転

 

これらを再帰ループのメカニズムの中で使用していくと
様々な様相の木々が作成できる。

今回L-systemを使って様々なテストをしてみた。
まずはスタンダートな木の作成。

lsystem03

 

次にタイプの異なる木を作ってみる。
まずは幹、太枝を生成して…

2016-02-07_195931

 

さらに小枝を生やして…

2016-02-07_195953

 

最後にランダム要素を追加してメッシュを生成。

2016-02-07_200005

 

さらにL-systemの文字コードを細かく調整。

lsystem02

 

Houdiniを使えばコピースタンプを使って
バリエーション増やすことも簡単。
これぞプロシージャル。

lsystem01

Houdini -> Maya Vray

よく忘れるので、HoudiniのデータをMayaへエクスポートして
VRayでレンダリングするやり方を書いておく。

 

1.RopOutputDriverなどでジオメトリを連番OBJファイルへエクスポート

 

2.以下のバッチを実行。

for %%T in (*.obj) do ply2vrmesh “%%T” “%%~nT.vrmesh”

これで連番objファイルを連番のVRayメッシュへコンバートしてくれる。
Alembicであれば.objの部分を.abcへ書き換える。
(ちなみにbgeoファイルはエラーが出てコンバート不可だった)

ply2vrmeshはVRayに付属するコンバーター。
事前に環境変数のパスを通しておくこと。

 

3.MayaからVRayProxyを作成し、2で吐き出したvrmeshを読み込む。
その際ファイル名を次のように設定するとパディング4の連番vrmeshを読み込んでくれる。

パス\ファイル名.<frame04>.vrmesh

2016-02-01_055445

2016-02-01_060358

 

4.VRayでレンダリング
vein

Houdini 血管アニメーション ver2

以前作った血管アニメーションのバージョン2。

今回は全てをSOPのWrangleで実装しておりDOPは使用していない。
通常POPを使うような部分もSolver SOPで代用している。

Wrangleにおけるポイントクラウドの扱いや、
動的なグループの組み換えがわかるようになれば
SOPでできることが格段に増えると実感した。

 

Houdini Vein Test ver02 from shuichi sakuma on Vimeo.

 

血管が広がる開始点は自由に設定でき、かなりのパラメータをUI上に公開してるので
パラメータからWangleのVEXが制御できるようになっている。

Houdini AttributeWrangleについて

Houdini備忘録

AttributeWrangleについて

2016-01-24_213346

 

AttributeWrangleをダブルクリックして中に入るとAttributeVopがある。

2016-01-24_213358

 

さらにAttributeVopをダブルクリックして中に入るとSnippetがあるが、
AttributeWrangleに書いたコードは実際にはこのSnippetに記述されるように
なっている。

2016-01-24_213437

2016-01-24_213500

肝要なのはこのSnippetがCVEXコンテキストで実行され
特定のコンテキスト内で実行されるわけではないこと。
よって、以下のグループ系関数を
AttributeWrangleに記述するとエラーとなる。

// pop,sopコンテキストのみで有効な関数
void addgroup(string group_name, int point_number)
int ingroup(string group_name, int point_number)
void newgroup(string group_name)
void removegroup(string group_name, int point_number)

 

 

ついでにCVEXコンテキストで有効なグループ系の関数をまとめてみた。

// stringには0-10や@Cd.x>0.5のような一時的なグループを使用することができる
// 空の文字列の場合すべてのポイント(プリミティブ)に相当する
int [] expandpointgroup(string filename, string groupname)
int [] expandpointgroup(int input, string groupname)
int [] expandprimgroup(string filename, string groupname)
int [] expandprimgroup(int input, string groupname)

// ポイント番号で指定したポイントが指定したグループ内にあれば1を返す
int inpointgroup(string filename, string groupname, int pointnum)
int inpointgroup(int input, string groupname, int pointnum)
int inprimgroup(string filename, string groupname, int primnum)
int inprimgroup(int input, string groupname, int primnum)

// ジオメトリの指定したグループ内のポイントの数を返す
int npointsgroup(string filename, string groupname)
int npointsgroup(int input, string groupname)

// ジオメトリの指定したグループ内のプリミティブの数を返す
int nprimitives(string filename, string groupname)
int nprimitives(int input, string groupname)

// 指定グループにポイント(プリミティブ)を含める
// その際valueには0以外の値を設定する
// 0を設定した場合にはグループからの除外を意味する
// グループが存在しなかった場合は【グループが作成される】
int setpointgroup(int geohandle, string name, int pt, int value, string mode=”set”)
int setprimgroup(int geohandle, string name, int prim, int value, string mode=”set”)

// 現在のポイント/エッジ/プリミティブ/パーティクルが指定グループ内にあるかは以下のやり方で判定可能
if(@group_グループ名 == 1)

// グループへの追加、グループからの解除
@group_グループ名 = 1;// グループへエレメントを追加
@group_グループ名 = 0;// グループからエレメントを削除

 

Deep Compositeのやり方

【備忘録】

Non Commercial版のHoudiniではDeep Composite(DSM Merge ROP)が
無効にされているため、Houdini内でのディープコンポジットができない。

代わりに今回Non Commercial版のNukeでやってみた。

 

まずHoudiniでDeepデータをEXR形式で吐き出す。

2016-01-12_053117

 

次にNukeで以下の以下のネットワークを組んでディープコンポジットを行う。
使用するのはDeepRead、DeepMerge、DeepToImage、Writeノード。

2016-01-12_053257