こんにちは!Rhinoです。
先日エスカレーターのアニメーションを作成する機会がありまして、どうやって作ろうかな?と考える場面があったものですから、非常に内容ですがまとめてみました。
ステップ(踏み台)を作成
まずはエスカレーターのステップを1段分だけ用意します。
幅120cm、高さ32cm、奥行40cmで作成しています。
ステップの基点は画像のような位置に設定しました。
一旦並べてみます。こんな感じにしてみました。
水平部分はZ軸で40cm、階段の部分はY軸20cm、Z軸35cmの間隔で並べました。
一定のルールで並べた方が作成し易いと思います。
横から見るとこんな感じです。
アニメーションの軌跡となるカーブを描く
並べたステップを動かすのですが、まずは動かすためのカーブを描きたいと思います。
ステップのアニメーションの軌跡となるようにカーブを描いていきます。
基点に沿ったカーブを描きたいので、まずはLocatorをガイドにしたいと思います。
並べたステップを[Edit / Duplicate]で複製し、[Modify / Replace Objects]でLocatorと置き換えます。
配置したLocatorにスナップさせてカーブを描きます。
カーブに沿ってステップを動かす
[Constrain / Motion Paths / Attach to Motion Path]でステップを作成したカーブに沿って動かします。
今回は1段分動くのに40F(フレーム)としました。
ステップを全部で10個作るので400Fでアタッチしています。
試しに40F動かしみます。
すると全然移動距離が足りないことが分かるはずです。
ちょっと見づらいかもしれませんが、本当はカーブの次のエディットポイントまで動かしたいわけです。アニメーションのカーブに原因がありそうです。
アニメーションのカーブをリニアにします。
良い感じの位置に来てくれました。
と、思ったのですがアトリビュートエディタで位置を確認してみますと、ちょっとだけずれてますね。
実際は水平部分は40cmずつ動かすはずです。
そこでTranslate Zの値がちょうど-40になるようにモーションパスのU Valueの値を編集しキーを打ちます。
これらを水平に動く箇所で行います。斜めに動く場合とでは移動距離が変わるからですね。
0F、40F、80F、320F、360F、400FでTranslate Zが40cmずつ移動するようU Valueの値を編集しキーを打っておきます。
ステップをアニメーションを付きで複製
ステップ一段分のアニメーションができましたので、こちらを利用して他のステップを作成します。
ステップのオブジェクトを選択後、[Edit / Duplicate Special]のオプション画面を開きます。
先ほど付けたモーションパスのアトリビュートごと複製する必要がありますので、Duplicate input graphにチェックを入れて、1つだけ複製してみます。
ステップとアトリビュートで結ばれたカーブが複製され同位置で動いているのではないでしょうか。
同位置で動かれても困りますので、予め40Fで一段分動くというルールを決めておいたことがここで役に立ちます。つまり、40Fぶんアニメーションをずらしてあげればいいんですね。
複製した方のステップを選択後、グラフエディタを開いてキーをすべて選択します。
どうでしょうか?ステップもちょうど40Fぶんずれて次の位置に移動したのではないでしょうか?
上手く次の位置に移動しない場合はキーフレームがリニアになってないかもしれませんので、確認してみて下さい。
再生してみましょう。
アニメーションの繋がりがおかしくないでしょうか?
ステップが最後重なってしまっていますね。
Infinityを使って修正します。キーフレームの前後の繰り返しを設定できますよ。
Pre Infinity、Post InfinityをそれぞれCycleに設定して再度再生してみましょう。
今度は重ならず良さそうですね。
あとはこれらの作業を段数ぶんだけ行えば完成です!
下りのアニメーションでしたけれど、上りはカーブを反転すれば作成できます。
おまけ
この複製してアニメーションをずらす作業はやや手間でしたので、Pythonでちゃちゃっと済ませたいと思います。
変数numがステップの個数で、intervalが1段分のフレームの間隔としてみました。
# -*- coding: utf-8 -*-
import maya.cmds as cmds
selection = cmds.ls( sl=True, fl=True )[0]
num = 10
interval = 40
for i in range( 0, num ):
newObj = cmds.duplicate( selection, rr=True, un=True )[0]
motionPath = cmds.listConnections( newObj, t="motionPath" )[0]
motionPath_Value = cmds.listConnections( motionPath, t="animCurveTL" )[0]
cmds.selectKey( cl=True )
cmds.selectKey( motionPath_Value, add=True, k=True )
cmds.setInfinity( pri='cycle', poi='cycle' )
cmds.keyframe( e=True, iub=True, r=True, o="over", tc=interval*-1 )
interval += 40
簡単なコードで作成できましたので、チャレンジしてみて下さい。
では、また!
コメント