Mayaで作るシンプルなエスカレーターアニメーション

こんにちは!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 InfinityPost 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

簡単なコードで作成できましたので、チャレンジしてみて下さい。
では、また!

コメント

タイトルとURLをコピーしました