クリックすると石が発生して落下する仕組みを作る
Houdiniで「インタラクティブに石を配置して、配置した先から落ちていくHDA」を作成するチュートリアル動画をやってみたので、自分用に解説を挟んで記録しておきます。
※ 記事の内容は元のチュートリアルから変えている部分もあります。
DIgitalAssetを作成
Geometry階層にAdd SOPを作り、それを含んだSubnet→HDAを作成する。
MultiParamを使って複数の項目を入力
Add SOP の Number of Points をパラメーターに登録する。すると自動的にMultiParamBlockになる。
HDA の Interactive スクリプトを入力
HDAのInteractive スクリプトにPythonスクリプトを入力する。といっても、サンプルコードをそのまま使うだけ。
落下する仕組みを作る
あらかじめ高い位置にポイントを移動して、VEXで下に落とす。ポイントには何かしらのオブジェクトをコピーしておく。
attribwrangle_falling
@P.y -= @Time * ch("speed");
//attribwrangle_stop_pos
if ( @P.y < 0) @P.y =0;
クリックしたフレームを取得
Add SOPの W(weight)の項目にクリックしたフレームを入れていく仕組みを作る。
HDAのInteractive スクリプトを編集。 # Create/move point if LMB is down (クリックした際にポイントの作成・移動)とコメントされたあたりのコードに、weightの設定を記載する。
self.node.parm("weight%d" % self.index).set(hou.frame())
Wの内容をFlameにしたので、TypeをIntにRangeも1始まりに変更しておく。Wには本来の用途とかはなくて、こういうふうに自由に定義して使うものなのかな、たぶん…
追加したフレーム数を移動の計算に加える
Wの項目をアトリビュート@Start_Frameにして、その値を移動の計算に加えます。
//attribwrangle_make_start_frame
i@Start_Frame = i@Pw;
先に作成したattribwrangle_fallingの内容も変更する。
スタートフレームになるまでは動かなくして、P.yの位置にもスタート時間を差分を加味するようにする。
//attribwrangle_falling
if ( @Frame >= @Start_Flame)
{
@P.y -= (@Frame - @Start_Frame) * ch("speed");
}
この記事が気に入ったらサポートをしてみませんか?