kick the base

Houdiniと、CG技術と、日々のこと。

Houdini: 影響範囲のコントロール方法

今回のお題

Twitterにこんな感じのアニメーションが流れてきたので作ってみたところ、これは初心者向けにいい題材なのではないかなと思ったので記事にまとめました。

本作例を通して大切なことは下記の通り。

  1. 一見複雑そうに見えるアニメーションをどう分解するか
  2. 影響範囲をどうコントロールするか

そして今日見かけたアニメーションも同じ仕組みでいけるなと思ったのでそちらも作りました。

せっかくプロシージャルで作っているので、使いまわしできるところに気が付くとよいかと思います。

以上。やっていきましょう。

サンプルファイル

サンプルhip

太極図のコイルアニメーション

まず、一見複雑そうに見えるアニメーションをどう分解するかについて考えてみます。*1

f:id:kickbase:20190317221820j:plain

アニメーションを見る限り、下記動きで成り立っていそうな感じです。

  1. コイル自体が左方向へ動く
  2. 太極図的な模様が回転する
  3. コイルの大きさがなだらかに変化している

これらのアニメーションを作るには、下準備として下記が必要となるでしょう。

  1. 太極図的な模様をつくる
  2. コイルをつくる

回転させたり、なだらかに変化させたりは後で考えましょう。

困難は分割せよです。

太極図的な模様をつくる

f:id:kickbase:20190317221844j:plain

拍子抜けするくらい簡単ですみません。細かく割ったGridにAttribute from MapSOPで太極図の画像を読み込んでCdアトリビュートを追加しただけです。もちろん太極図をモデリングしてカラー情報をAttribute Transfarで転写してもよいのですが、そこは簡単な方ということでこちらを採用しています。

f:id:kickbase:20190317221935j:plain

回転させるのはこれでいいでしょう。フレーム数だけ回転させてるだけですね。

コイルをつくる

f:id:kickbase:20190317222000j:plain

数学が苦手な方は「うげっ」となってしまうかもしれませんが、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"));

f:id:kickbase:20190317222040j:plain

先ほどと同様speedというスライダを作りスピードを調整しています。

影響範囲をコントロールするには?

回転する太極図と移動するコイルができました。あとは太極図の色情報(Cd)を使ってコイルを制御するだけですね。(コイルの大きさがなだらかに変化しているところについてはまずは置いておきましょう)

ここでシンプルな方向を見つけられるかどうかが本作例のカギとなります。例えばブーリアンで分解して、コイル状のところと直線のところを作って...などと考え始めるとドツボにハマります。ブーリアンがうまく行くか、接続部はちゃんとつながるかなど、複数の問題を解決しなければならなくなります。

ここではもっとシンプルに、コイルの大きさ(半径)を小さくしていけば直線に、大きくすればより大きいコイルになるんじゃない?と考えました。

ここに気づけばあとは実装するだけです!

太極図のカラー情報を半径アトリビュートに変換

f:id:kickbase:20190317222101j:plain

これは簡単です。今回は白黒なのでCdのどの値を取得してもOKですので先頭のメンバ(@Cd.x)を取り出しました。あとあと半径が小さかったので調整のため1.7をかけてます。

続いて色をリセットしています。

@r = @Cd.x*1.7;
@Cd = {1, 1, 1};

半径アトリビュートをラインに転写

f:id:kickbase:20190317222232j:plain

AttributeTransfarSOPでrアトリビュートを転写します。特に難しいことはないですね。

半径アトリビュートをコイルの半径にかける

f:id:kickbase:20190317222253j:plain

@P.x += @r * cos(@ptnum / ch("coil") + @Frame * ch("speed"));
@P.z += @r * sin(@ptnum / ch("coil") + @Frame * ch("speed"));

ここも難しくないでしょう。右辺の頭に@r *を追加しただけですね。

コイルの大きさをなだらかにする

f:id:kickbase:20190317222319j:plain

最後にここを実装します。ここもシンプルに考えましょう。

太極図のCdアトリビュートをAttribute BlurSOPでなだらかにしてあげれば良さそうです。

ここまでがコアの部分になります。

あとは味付け

f:id:kickbase:20190317222346j:plain

順番 ノード名 解説
1 Group Create 矩形のグループを作成
2 Blast 上記グループ以外を削除
3 Resample ポイントを振り直し
4 Smooth スムースをかけてコイルの形状をなめらかに
5 Color 色をグレーに

これで終わりですが、バリエーションを別に作ったものがあるのでそちらも紹介します。

バリエーション

「めんたいこ」という文字が右から左に流れるアニメーションです。やってることは変わりません。

f:id:kickbase:20190317224247j:plain

円の中で四角が回転するアニメーション

f:id:kickbase:20190317222523j:plain

ノードをご覧いただけばわかる通り、ほぼ同じ仕組みです。

まとめ

いかがでしょうか。影響範囲をコントロールする方法に気が付いてしまえば難しいことはなかったかと思います。

  1. 画像からCdアトリビュートを取得し
  2. Cdアトリビュートを利用して半径となるrアトリビュートを作成
  3. rアトリビュートをコイルの半径として利用する

小さな作例ですが、上記流れはHoudiniの本質でもあるかと思います。面白そうなアニメーションを見かけたら、Houdiniでアニメーショントレースをしてみるといい練習になるかもしれませんね。

*1:本作例はもとからそんなに複雑に見えないかもしれませんが、複雑な要件でも大切なことかと思います