モノをつかんで移動して置くアニメーション
意外と見つからない「置く」
オブジェクトをつかんで他のところへ移す、というアニメーションを作ってみたい。とりあえず試してみると、キャッチして移動させるところまでは "child of" コンストレイントを使うとできた。ところが、離すときにこのコンストレイントの影響を0にする必要があり、そうするとオブジェクトが元の場所にいきなり戻ってしまう。「置く」動作ができない。
"pickup release hold drop"などのキーワードでやり方をぐぐってみたのだけど、同じ場所に「置く」(つまり、元の場所に戻すだけ)だったり、「置く」動作の時にそれっぽい位置に手動で移動させるみたいなチュートリアルがいくつかあるばかり。なんかしっくりこない。空のオブジェクトを置く位置に作って、置く際にその空オブジェクトの位置と角度をコピーするというのもあった。なんかすごそうだけど難しい。
そうだ、物理処理をしてしまえばいいのでは?
オブジェクトをアニメーションさせる際に、シミュレーションの世界で処理してしまえば、置いた位置にそのまま残るのでは?というかこれは確実に残るだろう。そこをベースにちょっと考えてみた。
まずは、適当に舞台を作る。UFOキャッチャーのアームぽいのとつかまれるサル、そして床。最初、床にも物理設定をして落とすイメージでいたけども最終的にそうしなくてもできることがわかった。
アームに他の位置へ移動させるアニメーションをつけるのだけど、その前に、サルにアームの子供になるよう Child Of
コンストレイントを設定しておく。子供にした途端、サルが親のオブジェクトとなったアームの位置や回転の状態にひっぱられて変なところにいってしまう。これを Set Inverse
ボタンを押して初期位置になおす。
で、アームに適当に位置・回転の LocRot
キーフレームを打ってアニメーションをつけた。サルは Child Of
がつきっぱなしなので、当然ずっと持ったままになってしまっているが、とりあえず今はOK。
こどもになったりこどもじゃなくなったり
ここで、サルに物理設定をしておく。[物理演算プロパティ]から Rigid Body
ボタンを押して、 Type Active
の剛体にする。ただ、物理シミュレーションをするわけではなく、アニメーションの制御は基本的にこちらでしたいので、Dynamic
のチェックをはずし、Animated
のチェックをつけておく。
ここから、つかんだり離したりする際の設定をしていく。基本的に以下の通りにする。
- つかむ:直前のフレームおよびその直後のフレームで・・・
Child Of
のInfluence
を0.000
→1.000
にする。Rigid Body
のAnimated
を オフ → オン にする。
- 離す:直前のフレームおよびその直後のフレームで・・・
Child Of
のInfluence
を1.000
→0.000
にする。Rigid Body
のAnimated
を オン → オフ にする。
画像がちょっとわかりづらいけども、これは離してる状態から掴む状態に移行するところ。左が10フレーム目で、離した状態の最後。Child Of
の影響が0(子供になっていない)で、かつAnimated
をオフにしてアニメ制御していない状態。右が次の11フレーム目で、掴む状態の最初。Child Of
の影響を1(子供にする)にして、かつAnimated
をオンにすることでアームの動きに追従してアニメーションすることができる。
離すときは、コレの逆(「つかむ」→「離す」)のキーフレームを打てばよい。んでできたアニメーションがこれ。
問題なくキャッチ&リリースができた。つかむ・離すをまた繰り返したいときは、前述の通りキーフレームを何度でも打つことができる。
物理設定、いいんだろうか
正直、物理設定(Rigid Body)をした際のコストがわからない。シミュレーションはしていないので動作が重くなることはないと思うけども、本当は最初にあげた「離すときにそれっぽい位置に移動させる」とした方がいいのかもしれない。
ただ、移動先の正確な位置や角度を見つけ出すのは若干めんどくさい。親子付けして移動されたオブジェクトは、位置などのパラメタが変わらない。なので、離す位置で Apply
(Ctrl+A) - Visual Transform
を選び一旦確定させる。すると、ツールシェルフの Item
にパラメタが反映されるので、それを「メモ」しておく。メモしたら Ctrl+Z
で動作を確定前に巻き戻して、手でメモどおりに入力していく。という方法しか思いつかなかった。
これをいっぺんにやってくれるアドオンがあった。これが一番ラクなのかも。