こんにちは!Rhinoです。
先日エスカレーターのアニメーションを作成する機会がありまして、どうやって作ろうかな?と考える場面があったものですから、非常に内容ですがまとめてみました。
ステップ(踏み台)を作成
まずはエスカレーターのステップを1段分だけ用意します。
幅120cm、高さ32cm、奥行40cmで作成しています。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_1200_600_001-1024x512.jpg)
ステップの基点は画像のような位置に設定しました。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_pivot_1200_600_001-1024x512.jpg)
一旦並べてみます。こんな感じにしてみました。
水平部分はZ軸で40cm、階段の部分はY軸20cm、Z軸35cmの間隔で並べました。
一定のルールで並べた方が作成し易いと思います。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_steps_1200_600_001-1024x512.jpg)
横から見るとこんな感じです。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_steps_1200_600_002-1024x512.jpg)
アニメーションの軌跡となるカーブを描く
並べたステップを動かすのですが、まずは動かすためのカーブを描きたいと思います。
ステップのアニメーションの軌跡となるようにカーブを描いていきます。
基点に沿ったカーブを描きたいので、まずはLocatorをガイドにしたいと思います。
並べたステップを[Edit / Duplicate]で複製し、[Modify / Replace Objects]でLocatorと置き換えます。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_replace_locator_1540_770_001.gif)
配置したLocatorにスナップさせてカーブを描きます。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_draw_cuve_1540_770_001.gif)
カーブに沿ってステップを動かす
[Constrain / Motion Paths / Attach to Motion Path]でステップを作成したカーブに沿って動かします。
今回は1段分動くのに40F(フレーム)としました。
ステップを全部で10個作るので400Fでアタッチしています。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_attach_to_motion_path_1540_770_001.gif)
試しに40F動かしみます。
すると全然移動距離が足りないことが分かるはずです。
ちょっと見づらいかもしれませんが、本当はカーブの次のエディットポイントまで動かしたいわけです。アニメーションのカーブに原因がありそうです。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_animation_1200_600_001-1024x512.jpg)
アニメーションのカーブをリニアにします。
良い感じの位置に来てくれました。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_edit_animation_curve_1540_770_001.gif)
と、思ったのですがアトリビュートエディタで位置を確認してみますと、ちょっとだけずれてますね。
実際は水平部分は40cmずつ動かすはずです。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_translate_z_value_260_350_001.jpg)
そこでTranslate Zの値がちょうど-40になるようにモーションパスのU Valueの値を編集しキーを打ちます。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_translate_z_value_260_350_002.jpg)
これらを水平に動く箇所で行います。斜めに動く場合とでは移動距離が変わるからですね。
0F、40F、80F、320F、360F、400FでTranslate Zが40cmずつ移動するようU Valueの値を編集しキーを打っておきます。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_animation_1200_600_002-1024x512.jpg)
ステップをアニメーションを付きで複製
ステップ一段分のアニメーションができましたので、こちらを利用して他のステップを作成します。
ステップのオブジェクトを選択後、[Edit / Duplicate Special]のオプション画面を開きます。
先ほど付けたモーションパスのアトリビュートごと複製する必要がありますので、Duplicate input graphにチェックを入れて、1つだけ複製してみます。
ステップとアトリビュートで結ばれたカーブが複製され同位置で動いているのではないでしょうか。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/duplicate_special_options_001.jpg)
同位置で動かれても困りますので、予め40Fで一段分動くというルールを決めておいたことがここで役に立ちます。つまり、40Fぶんアニメーションをずらしてあげればいいんですね。
複製した方のステップを選択後、グラフエディタを開いてキーをすべて選択します。
どうでしょうか?ステップもちょうど40Fぶんずれて次の位置に移動したのではないでしょうか?
上手く次の位置に移動しない場合はキーフレームがリニアになってないかもしれませんので、確認してみて下さい。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_step_edit_animation_curve_1540_770_002.gif)
再生してみましょう。
アニメーションの繋がりがおかしくないでしょうか?
ステップが最後重なってしまっていますね。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_steps_animation_1540_770_001.gif)
Infinityを使って修正します。キーフレームの前後の繰り返しを設定できますよ。
Pre Infinity、Post InfinityをそれぞれCycleに設定して再度再生してみましょう。
今度は重ならず良さそうですね。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_steps_animation_1540_770_002.gif)
あとはこれらの作業を段数ぶんだけ行えば完成です!
下りのアニメーションでしたけれど、上りはカーブを反転すれば作成できます。
![](https://www.betternowcgz.com/wp-content/uploads/2021/12/maya_escalator_simple_animation_1200_600_001.gif)
おまけ
この複製してアニメーションをずらす作業はやや手間でしたので、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
簡単なコードで作成できましたので、チャレンジしてみて下さい。
では、また!
コメント