今回のお題
Twitterにこんな感じのアニメーションが流れてきたので作ってみたところ、これは初心者向けにいい題材なのではないかなと思ったので記事にまとめました。
Houdiniでコイルっぽいのがウネウネするやつ、ちょっときれいにした。来週ブログに書くけど、かなり簡単な仕組みなので初心者向けの記事になると思います。 pic.twitter.com/b6k5k3NS7E
— ブローノ・めんたいこ (@kickbase) 2019年3月2日
本作例を通して大切なことは下記の通り。
- 一見複雑そうに見えるアニメーションをどう分解するか
- 影響範囲をどうコントロールするか
そして今日見かけたアニメーションも同じ仕組みでいけるなと思ったのでそちらも作りました。
Houdiniで作ってみた。今日ブログ書こうと思ってたやつとほぼ一緒の仕組みなので合わせて解説する。 pic.twitter.com/Bt8ePe8kTX
— ブローノ・めんたいこ (@kickbase) 2019年3月17日
せっかくプロシージャルで作っているので、使いまわしできるところに気が付くとよいかと思います。
以上。やっていきましょう。
サンプルファイル
太極図のコイルアニメーション
まず、一見複雑そうに見えるアニメーションをどう分解するかについて考えてみます。*1
アニメーションを見る限り、下記動きで成り立っていそうな感じです。
- コイル自体が左方向へ動く
- 太極図的な模様が回転する
- コイルの大きさがなだらかに変化している
これらのアニメーションを作るには、下準備として下記が必要となるでしょう。
- 太極図的な模様をつくる
- コイルをつくる
回転させたり、なだらかに変化させたりは後で考えましょう。
困難は分割せよです。
太極図的な模様をつくる
拍子抜けするくらい簡単ですみません。細かく割ったGridにAttribute from MapSOPで太極図の画像を読み込んでCdアトリビュートを追加しただけです。もちろん太極図をモデリングしてカラー情報をAttribute Transfarで転写してもよいのですが、そこは簡単な方ということでこちらを採用しています。
回転させるのはこれでいいでしょう。フレーム数だけ回転させてるだけですね。
コイルをつくる
数学が苦手な方は「うげっ」となってしまうかもしれませんが、CGで円運動・単振動・コイルを見かけたら三角関数でいけそうと思ってください。
「なんで三角関数(三角形)の数式で円ができるんだよ!」と思う方もおられると思いますが、そこらへんは後日CGと数学についてのチュートリアル動画で詳しく解説する予定なので、そちらの完成をお待ちください。
まずは、三角関数でコイルができるんだなーくらいのイメージを持ってくれればOKです。(今回の話で最も重要なポイントはここではないので軽く流します)
コードは下記の通りになっていて、coilというスライダーを左右に動かすとバネの形状が変わります。VEXでch("パラメータ名")
を書いてからCreates spare parameters for each unique call of ch()
ボタンを押すとスライダーを作ってくれるので便利ですね。
@P.x += cos(@ptnum / ch("coil")); @P.z += sin(@ptnum / ch("coil"));
このままだと左方向に動いてくれないので、下記の通りコードを修正します。
@P.x += cos(@ptnum / ch("coil") + @Frame * ch("speed")); @P.z += sin(@ptnum / ch("coil") + @Frame * ch("speed"));
先ほどと同様speedというスライダを作りスピードを調整しています。
影響範囲をコントロールするには?
回転する太極図と移動するコイルができました。あとは太極図の色情報(Cd)を使ってコイルを制御するだけですね。(コイルの大きさがなだらかに変化しているところについてはまずは置いておきましょう)
ここでシンプルな方向を見つけられるかどうかが本作例のカギとなります。例えばブーリアンで分解して、コイル状のところと直線のところを作って...などと考え始めるとドツボにハマります。ブーリアンがうまく行くか、接続部はちゃんとつながるかなど、複数の問題を解決しなければならなくなります。
ここではもっとシンプルに、コイルの大きさ(半径)を小さくしていけば直線に、大きくすればより大きいコイルになるんじゃない?と考えました。
ここに気づけばあとは実装するだけです!
太極図のカラー情報を半径アトリビュートに変換
これは簡単です。今回は白黒なのでCdのどの値を取得してもOKですので先頭のメンバ(@Cd.x
)を取り出しました。あとあと半径が小さかったので調整のため1.7
をかけてます。
続いて色をリセットしています。
@r = @Cd.x*1.7; @Cd = {1, 1, 1};
半径アトリビュートをラインに転写
AttributeTransfarSOPでr
アトリビュートを転写します。特に難しいことはないですね。
半径アトリビュートをコイルの半径にかける
@P.x += @r * cos(@ptnum / ch("coil") + @Frame * ch("speed")); @P.z += @r * sin(@ptnum / ch("coil") + @Frame * ch("speed"));
ここも難しくないでしょう。右辺の頭に@r *
を追加しただけですね。
コイルの大きさをなだらかにする
最後にここを実装します。ここもシンプルに考えましょう。
太極図のCd
アトリビュートをAttribute BlurSOPでなだらかにしてあげれば良さそうです。
ここまでがコアの部分になります。
あとは味付け
順番 | ノード名 | 解説 |
---|---|---|
1 | Group Create | 矩形のグループを作成 |
2 | Blast | 上記グループ以外を削除 |
3 | Resample | ポイントを振り直し |
4 | Smooth | スムースをかけてコイルの形状をなめらかに |
5 | Color | 色をグレーに |
これで終わりですが、バリエーションを別に作ったものがあるのでそちらも紹介します。
バリエーション
「めんたいこ」という文字が右から左に流れるアニメーションです。やってることは変わりません。
プロシージャルはバリエーション作りが楽でいいなー。 pic.twitter.com/HxvXI07JhZ
— ブローノ・めんたいこ (@kickbase) 2019年2月28日
円の中で四角が回転するアニメーション
ノードをご覧いただけばわかる通り、ほぼ同じ仕組みです。
まとめ
いかがでしょうか。影響範囲をコントロールする方法に気が付いてしまえば難しいことはなかったかと思います。
- 画像から
Cd
アトリビュートを取得し Cd
アトリビュートを利用して半径となるr
アトリビュートを作成r
アトリビュートをコイルの半径として利用する
小さな作例ですが、上記流れはHoudiniの本質でもあるかと思います。面白そうなアニメーションを見かけたら、Houdiniでアニメーショントレースをしてみるといい練習になるかもしれませんね。
*1:本作例はもとからそんなに複雑に見えないかもしれませんが、複雑な要件でも大切なことかと思います