こんばんは、HIDです。
私も随分長い事AfterEffectsとという映像ソフトウェアを使っているのですが
昔から円運動や螺旋運動を綺麗に作ろうと思うと、色々と面倒くさく
親子レイヤーを使ったりする手もあるにはあるのですが、応用に欠けどうかって言うと
ちょっとニガテな領域だったんですが、最近エクスプレッションに対する理解が一気に深まってきて
いろんな事が出来るようになってきました
で、そのニガテだった螺旋運動を克服できちゃったので何だか嬉しい日々
エクスプレッションってのは映像の中に組み込んじゃうプログラムみたいなもんで
コレがわかると手作業ではちょっとしんどいなって動きとかが作れちゃうんです
って訳でエクスプレッションを使った螺旋運動の作り方
まずヌルオブジェクトでも何でも良いので動かす対象を作ります
(動きがわかりやすいように平面とライトを配置してシャドウを落としてます)

ヌル1にエフェクト→エクスプレッション制御→スライダ制御
を適用してコレを2個作ります
後々これを振幅と周期の制御に使いたい為
わかりやすいようにエフェクトの名前をcycleとswingにかえておきます
まず、手前から奥に向かって円運動するアニメーションを付けてみましょう
ヌル1のポジションのエクスプレッションフィールドに次のように記述します

cy = effect("cycle")("スライダ");
sw = effect("swing")("スライダ");
x = Math.sin(time*cy)*sw+value[0];
z = Math.cos(time*cy)*sw+value[2];
[x,position[1],z]
はい、一気に訳が分からなくなりました
解説して行きます
cy =
effect("cycle")("スライダ");
この計算式の中で
cyって書いたら、
エフェクトの(cycle)の(スライダ)の値を拾ってね
同様に
sw =
effect("swing")("スライダ");は
この計算式の中で
swって書いたら、
エフェクトの(swing)の(スライダ)の値を拾ってね
って事です
毎回毎回計算式の中で長い文字列を入力するのは面倒だし
間違いが起こりやすいので
何らかの文字に代入しちゃう訳です
x = Math.sin(time*cy)*sw+value[0];
z = Math.cos(time*cy)*sw+value[2];
ここで混同しては行けないのが【x】や【z】と言うのはx座標やz座標の事を指している訳ではありません
xという文字に計算を凝縮してるだけです
エクスプレッションでは単純にxやy、zと記載してもそれが座標とは認識してくれないのです
x座標を指定するならposition[0]
y座標を指定するならposition[1]
z座標を指定するならposition[2] です
さて、
x =
Math.sin(time*cy)sw+value[0]う〜ん、何やら高校の数学、関数の授業で見かけたような物が出てきましたが
数学の授業は基本寝てたので細かい事はよくわかりません(笑)
ちゃんと授業受けとけば良かったと後悔するばかり
サイン波に対して
時間 × 先ほど定義したcyの値をかけてね、さらに先ほど定義した
swをかけてね、それに
x座標の現在値を足したものを
【x】とするよ
って事で良いのかな?
同様に
z =
Math.cos(time*cy)sw+value[2]コサイン波に対して
時間 × 先ほど定義したcyの値をかけてね、さらに先ほど定義した
swをかけてね、それに
z座標の現在値を足したものを
【z】とするよ
もう一度言いますが数学的な事はよく分かってないので
サイン派に対してってのは解説的に間違ってるかもしれません
ここまでが代入による定義です
ここで初めて座標として反映する指示をしてあげます
[x座標の数値,y座標の数値,z座標の数値]
で入力するのが決まり事なので
[
x,
position[1],
z]
色々と代入した【x】の結果がx座標,
y軸の座標そのまま,
色々と代入した【z】の結果がz座標この状態でようやく円運動の完成です
今回、周期となるスライダcycleの値を3.14、振幅となるスライダswingの値を360に設定しました
x軸は1秒間に360ピクセル行き来をして
z軸も1秒間に360ピクセル行き来する運動が発生します
運動の結果がこちら
[
広告]
VPS螺旋運動まで解説しようと思いましたが、随分長くなっちゃったので残りは次回という事で