見出し画像

クリックすると石が発生して落下する仕組みを作る

Houdiniで「インタラクティブに石を配置して、配置した先から落ちていくHDA」を作成するチュートリアル動画をやってみたので、自分用に解説を挟んで記録しておきます。

※ 記事の内容は元のチュートリアルから変えている部分もあります。

DIgitalAssetを作成

Geometry階層にAdd SOPを作り、それを含んだSubnet→HDAを作成する。

Add SOPを作る
Subnet化して、更にHDA化する

MultiParamを使って複数の項目を入力

Add SOP の Number of Points をパラメーターに登録する。すると自動的にMultiParamBlockになる。

MultiParamBlockで複数項目を設定できる

HDA の Interactive スクリプトを入力

HDAのInteractive スクリプトにPythonスクリプトを入力する。といっても、サンプルコードをそのまま使うだけ。

Interactive欄には最初は何も書かれていない。Newを押す。
Samplesの項目にAdd Pointがあるのでそれを選択してAccept。
HDAをEnterキーで編集中はクリックするたびにポイントを追加できるようになった。

落下する仕組みを作る

あらかじめ高い位置にポイントを移動して、VEXで下に落とす。ポイントには何かしらのオブジェクトをコピーしておく。

ネットワークを作成
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の設定を記載する。

Pythonコードに追加する
self.node.parm("weight%d" % self.index).set(hou.frame())

Wの内容をFlameにしたので、TypeをIntにRangeも1始まりに変更しておく。Wには本来の用途とかはなくて、こういうふうに自由に定義して使うものなのかな、たぶん…

生成したFlame数が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");
}


この記事が気に入ったらサポートをしてみませんか?