~基本的すぎてあまり紹介されない、ちょっと便利なTips紹介~
『Houdiniかんたんレシピ』は、Houdiniを使っていく上で、基本的なことですが基本すぎてチュートリアル等で紹介されないような、ちょっとしたTipsや、ニッチな機能を紹介していくシリーズです。
かんたんレシピ第13回目は、Ramp vs チャンネルカーブです。
カーブを元にアトリビュートを制御する時に、FloatのRampパラメーターを使うことがあると思います。
しかし、RampパラメータのFloatカーブは自由な形を作るのが大変だと思いませんか?
Rampパラメータができる以前は、エクスプレッションを使ってチャンネルカーブを元にアトリビュートを制御するといったことをしていました。
そこで今回はRampとチャンネルカーブのそれぞれの使い方と、比較をしていきたいと思います。
Rampとチャンネルカーブの比較
Ramp
- VOPでもWrangleでも使用可能で処理が早い。
- カーブ形状のアニメーションができる。
- ランプを作るWindowが狭い。
- ランプカーブを0~1の範囲内で作る必要がある。
- ランプ形状の補間方法が使いづらい。
- 拡大ができないので細かいカーブを作るのが難しい。
チャンネルカーブ
- Animation Editorが使用できるため、カーブの形状を作りやすい。
- 拡大縮小が自由自在。
- 数値も自由に設定できる。
- VOPでは使用できない。
- カーブ形状のアニメーションが簡単にはできない。
Rampパラメータでは、細かいカーブが比較的作りづらいと思います。
実際の使用例(グリッドの変形)
○Expressionの場合
どちらの場合もPoint-Old SOPを使って、Spareパラメーターを作ってそれを参照します。
同じような形状になるように設定しています。
- Rampを使う
Rampパラメータを作って、chramp()で参照します。
Rampの場合は、先程の比較にもあった通り、数値の範囲を0~1にする必要があるので、Expressionの方で整形しています。
- チャンネルカーブとchf()を使う
floatパラメータを作り、キーフレームでチャンネルカーブを作って、chf()で参照します。
横軸がフレーム値になるので、それを計算してchf()を設定します。
この例では、$BBXの0~1を100倍することでフレーム0~100を参照するように設定しています。
○Wrangleの場合
先程の例と、同じような形状になるように設定しています。
- Rampを使う
Rampパラメータを作ってchramp()で参照します。
以下は、こちらの例のWrangleのVEXスニペット文です。
vector BBOX = relbbox(0,@P); // バウンディングボックスの計算 @P.y=chramp("ramp",BBOX.x)-0.5; // Rampパラメータ"ramp"を参照してY座標に設定
- チャンネルカーブとchを使う
floatパラメータを作ってキーフレームでチャンネルカーブを作ってch()で参照します。
VEXにはchf()が無く、別時間の値を参照する関数はch()になります。
また、chf()がフレーム参照なのに対してchは秒になるので注意が必要です。
以下は、こちらの例のWrangleのVEXスニペット文です。
vector BBOX = relbbox(0,@P); // バウンディングボックスの計算 @P.y=ch("ramp",(BBOX.x*100-1)/$FPS); // chでFloatパラメータ"ramp"を参照してY座標に設定 // chはtimeで参照するので/$FPSすることでフレームを秒に変換してます
○VOPの場合
チャンネルを参照するVOPノードが無いため、ch、チャンネルカーブを使用することができません。
VOPの場合は、RampVOPでRampパラメータを使用する方法のみが使用可能となります。