作成者別アーカイブ: admin

ターミネーター・ニューフェイト

「ターミネーター・ニューフェイト」を観に行く。

予備知識ゼロで見たが、なかり面白かった。
何よりパート2の正式な続編ということで、所々に2へのオマージュが見られて
少しなつかしい気持ちになった。

ターミネーター2をみたのは、高校生のとき。
当時T-1000(液体金属ターミネーター)に使用されたCG技術に驚いたのを覚えている。
結果、将来CGに関わる仕事がしたいと考えるようになり
大学の学部を情報工学に決めた経緯がある。
そういう意味では、大げさに言えば映画「ターミネーター2」は自分の人生の
ターニングポイントだった。
(しかし大学ではコンピュータサイエンスの勉強はしたが、CGに特化した授業はなかった)

映画の最初の方に、若かりし頃のリンダ・ハミルトン、シュワルツェネッガー、
エドワード・ファーロングをCGで再現したショットがあるが、
「ブレードランナー2049」のレイチェル並みの完成度だった。
ボディは実写の俳優、顔だけ置き換えているらしい。
↓レイチェルの記事。
https://gigazine.net/news/20171117-bladerunner2049-rachael/

新しいタイプのREV-9もなかなか斬新なターミネーターで、見ていて楽しかった。
グレースが攻殻機動隊(押井守版)の草薙素子に見えたのは自分だけ?

Houdini 戦車アニメーション

以前Houdiniで作成した戦車モデルにアニメーションを設定してみた。
今回、戦車自体はOBJレベルでキーフレームアニメーションで動かし、
キャタピラと車輪の動きはSOPレベルでVEXを使ってコントロールしている。

拙著「Houdini SOP&VEX編」に記載しているキャタピラを動かすためのVEXを
凹凸地形にも対応できるように今回改良した。

戦車は旋回の方向によって左右のキャタピラと車輪の回転を
逆にする必要があるが、それにも対応できるようにした。

このためにCHOPで微分(差分)計算を行った。
具体的には、OBJレベルで作成した戦車の回転アニメーションをCHOPに読み込み
Slope CHOPでチャンネルカーブに対して微分操作を行った。

これによりチャンネルカーブの傾き情報(速度)が得られるため
「傾きがプラスだったら右旋回中、マイナスだったら左旋回中」のようにVEXの中で判定し、
適切な方向にキャタピラと車輪を回転させることができるようになる。
戦車の前進・後進の判定にもSlope CHOPを使用した。
(ちなみに、微分の逆の積分操作はArea CHOP)

テクスチャーはSubstance Painterを使って作成し、
最後にPyroで土煙を加えて完成。

Houdini カメラ振動

先日作成したロボットウォークアニメーションに足の接地と同期するカメラの振動を加えてみた。

以下簡単な手順

1.ロボットの足裏の接地タイミングに合わせてCHOP内でパルス波を作成。パルス波を作成するために、足裏にポイントを一つ仕込んでおきSOP内でそのポイントが接地した最初のタイミングで赤に変わるようにしておく。そしてCHOP内のGeometryノードによってその赤情報をチャンネルに変換。

2.CHOP内のCopyノードを使って、パルス波をトリガーにして振動しながら徐々に減衰していくチャンネルをコピー。

3.Channel Wrangle内のVEXによってチャンネル形状を加工

4.カメラのtyパラメーターからchop関数を使って、チャンネルを参照


CHOPコンテキストのCopyノードはSOPのものとは使用方法が根本的に異なる。左側の入力はパルス波のようなトリガーシグナル、右側の入力はトリガーシグナルに応じてコピーされるチャンネルになっている。

今回初めてChannel Wrangleを使用したが、いつ追加されたのだろう?
WrangleによってCHOP内でもVEXが使用できるため以前よりもチャンネルの加工が
直感的にできるようなった。

Houdiniのアニメーション作業

Houdiniでシンプルなモデルを作って、リギング作業→キーフレーム作業→エフェクト作業を
通してやってみた。

一般的にHoudiniというとエフェクト分野に強いイメージがあるが
通常のキーフレームを主体とするアニメーション作業も十分やりやすい。
またHoudiniでアニメーション作業を行った場合には、シームレスに
そのあとのエフェクト作業につなげられるというメリットもある。

猫の跳躍力

猫の運動能力には毎回感心する。
特に跳躍力。

押入れの上段扉を開けておくと
エルはジャンプして中に入ってしまう。

「晩御飯まだかな?」

Houdini カールノイズ関数について

Houdiniにおけるカールノイズについて。

カールノイズを使用したサンプルファイルでよく見かけるのは
「CurlNoiseノード」を使用した以下のようなVOPネットワーク。

CurlNoiseノードが返すベクトルは湧き出しや吸い込みがない(発散がない)流れ場を構成するが、
CurlNoiseノードにはSDFSigned Distance Field)が接続できるようになっているので
ボリュームとの衝突を回避させることもできる。

CurlNoiseのCurlとはベクトル解析におけるベクトル場における回転を意味する。
ベクトル場に対してこの「回転」という演算を施せば、ある地点の渦度を表すベクトル(回転軸+回転の大きさ)が手に入る。また、ベクトル解析の基本公式により、回転演算によって求めたベクトル場には発散がないことが保証される。(この「発散がない」ことによってパーティクルを「いい感じ」に流すことができる)

しかし実は、このVOPノードに1対1で対応するVEX関数はヘルプには記載されていない。
ヘルプに記載されている以下の2つのカールノイズ関数(curlnoise関数、curlxnoise関数)は
位置に応じたカールノイズは生成できるが、衝突用のSDFボリュームを渡すための引数がない。

vector  curlnoise(vector xyz)
vector  curlnoise(vector4 xyzt)

しかし、以下のようにVEXコードの先頭でvoplib.hをインクルードすることで
CurlNoiseノードに対応するVEX関数(vop_curlNoiseVV関数)を使用することができるようになる。これによりVEX関数だけで障害物ボリュームとの衝突を避けつつ、発散がない流れ場に沿ってポイントを移流させるアニメーションが可能となる。

#include <voplib.h>

v@curlnoise = vop_curlNoiseVV(
    @P, 1*{1,1,1}/*周波数*/, {0,0,0}/*オフセット*/, {0,0,0}/*法線ベクトル(0の場合はSDFからgradient(勾配)を自動的に計算)*/,
    "pnoise"/*ノイズタイプ(Perlin Noise)*/, @OpInput2/*衝突用のSDFボリューム*/,
    3/*乱流*/, 1/*衝突の際に速度の反転*/,
    0.3/*振幅*/, 0.5/*粗さ*/, 1/*減衰*/, 
    0/*サーフェイスまでの距離(衝突ボリュームを設定しない際に有効)*/, 
    0.1/*衝突回避処理を発動する際のサーフェイスからの距離*/, 
    0.0001/*ステップサイズ*/);

@v = {0,0.2,0}+v@curlnoise;// 上昇するよう+Y軸方向に指向性を与えて速度とする
@v = clamp(@v,-0.4,0.4);// 速度の大きさに制限をかける
@P += @v*@TimeInc;// 速度から位置を求める積分計算

実際のVEXは以下のようにSolver内のWrangleノードに書いてやればよい。


vop_curlNoiseVV関数は、2007年のRobert Bridson氏の論文
「Curl-Noise for Procedural Fluid Flow」を忠実に実装したものとなっている。
https://www.cs.ubc.ca/~rbridson/docs/bridson-siggraph2007-curlnoise.pdf

 

ちなみに、CurlNoise VOPノードを右クリックして「View VEX Code」を選択すると
VOPが生成するソースコードを見ることができる。
そこでvop_curlNoiseVV関数の名称が確認できる。


vop_curlNoise関数は2つあるが、それぞれ以下のような役割。
vop_curlNoiseVV関数 → 最初の引数にvector(位置)を渡す。vectorが返る
vop_curlNoiseVP関数 → 最初の引数にvector4(位置+時間)を渡す。vectorが返る

【まとめ】カールノイズを使用するメリット
1.  VEX関数のみで吸い込みや湧き出しのないベクトル場が作成できる
2.  SDFボリュームを関数の引数に設定すれば、障害物との衝突を回避しながらの移流ができる
3.  SOPだけで計算が完結するため処理が軽い

Windowsではvoplib.hは以下のパスにある。(**はバージョン)
(C:\Program Files\Side Effects Software\Houdini 17.
.***\houdini\vex\include)

久々のロードバイク

今日は暑さも一段落したので、久しぶりのロードバイク。
走るのは湾岸沿いなので、気温30度以下であれば海風を受けてなんとか走れる。

エルは北欧の猫なので暑さは苦手のはずだが
暑さよりもエアコンの風が苦手みたい。

Houdini 煙いろいろ

Houdiniでいろいろなタイプのスモークを作ってみた。

スモークのvelフィールドのベースとなるのは、
パーティクルの速度ベクトル(@v)や、
シミュレーション後のRBDの速度ベクトルをVDBに変換したもの(@collisionvel)

パーティクルの速度ベクトルはDOP内でGas Particles To Field、
VDBはVolume Sourceのcollisionプリセットで読み込んだ。

●ドラゴンブレススモーク
パーティクル速度ベース

Houdini dragon fire wip v1 from shuichi sakuma on Vimeo.

●ビル崩落スモーク
RBDの速度ボリュームベース

Houdini Buiding destruction wip from shuichi sakuma on Vimeo.

●放射状スモーク
拙書「Houdini SOP&VEX編」の花火(8-7)がベース
パーティクル速度ベース

Houdini radial smoke test from shuichi sakuma on Vimeo.

●地割れスモーク
RBDの速度ボリュームベース

Houdini ground smoke test from shuichi sakuma on Vimeo.

●爆発スモーク
RBDの速度ボリュームベース

Houdini Box explosion test from shuichi sakuma on Vimeo.

Houdiniで作る廃墟

「廃墟」をテーマにHoudiniでアニメーションを作成してみた。

今回Houdiniでやったこと

・ドラゴンの羽・尾・首アニメーション(Bend+CHOP)
・ドラゴン群衆ユニットの移動タイミング、ロール回転制御、群れのばらつき具合の制御(VEX)
・背景ビルモデリング(VEX、VDB)
・ツタ植物モデリング(VEX)
・ビルに対するツタの巻き付け制御(VEX)
・デブリパーティクル(DOP)
・DOF、フォグ(COP)

ツタの成長方向はVEXでコントロールし
どんな形状のビルに対しても巻き付くようにVEXで制御した。

今回、コンポジットはCOPで行ったが
昔に比べるとUIが圧倒的にわかりやすくなっており使用しやすくなった。

シーンの規模が大きくなるほど、Houdiniを使用するメリットが実感できる。

香箱すわり

エルは休みの日にはベッドに上がってきてこの態勢で座ることが多い。
この座り方は「香箱すわり」というらしく、猫がリラックスしている状態らしい。
エルは平日はあまりベッドに上がることはないので
エルには曜日の感覚があるのではないかと思う今日この頃。