アニメーション 揺れ物に愛を その1
アニメーション 揺れ物に愛を その2
揺れ物の動きが甘いと、体の動きが台無しになる
なので、揺れ物には時間がかかるのだ
時には体本体よりも時間がかかる、そういうモノサ
では言ってみましょう
揺れ物に愛を
アニメーター誰もが知っている、
手っ取り早く、ソレっぽい
揺れ物の付け方がある
それは位相を利用する方法なのサ
つまり、同じアニメーションを、順番にずらすのだ
ただし、この方法
ソレっぽいだけで、リアリティは無い
簡単だけど、メリットとデメリットは必ずあるんだ
ひとまず、口で説明しても
ぱっとイメージが浮かばないと思うので動画をどうぞ
適当に作ったので動きは突っ込まないでね・・・
【まず、一律同じアニメーションを付けた後】
↓
【子供の構造の方のアニメーションをずらしている】のだ
列順にずらすことと、行順にずらしている
すると、こんな感じで揺れ物を付ける事ができる
少々作り込めば、ソレっぽくはなる
おしまい・・・・って、そういう事じゃない
この手法の要は、”ずらす事” なので
ワザワザ手でやらなくてもいい
ココは賢く、スクリプトを利用してみよう
といっても、大した話しではない
さっき手で作った、”ずらし”を自動で行う様にするのサ
つまり・・・こういう事だ
こんな感じで、一つの”オブジェクトの動きをずらし”て
手でやった方法を簡単に作成するのサ
まぁ、どこででもやっている方法だとは思うので
珍しくはないと思うけど
サンプルシーンを付けたよ
簡単なのでリガーならば見れば分かると思う
(サンプルはページ下記にあります)
それでは、簡単に解説
といった感じ
ベースを設ける事で、常に値が0起点でアニメーションを再生できる
オフセットは、スクリプトで揺れた結果に
さらにアニメーションを加える時にでも使う
言わば、アニメーションレイヤだ
アトリビュートに、コントローラーとなる
オブジェクトを設定出来るようにしている
方法としてはnodetransformMonitorを使って
アトリビュートのプロパティにオブジェクトを保存する
スクリプトはこんな感じだ
[as3]
/********************************************************
オブジェクトを選択して
Ctrl+Eで実行
*******************************************************/
newAttrib1 = attributes Params –アトリビュートに追加
(
parameters Params rollout:param_rol
(
targetNode type:#maxObject; –tabSize:0 tabSizeVariable:true;
delay type:#float animatable:true ui:delaySpn default:0;
ratio type:#float animatable:true ui:ratioSpn default:0;
sjRoller type:#boolean animatable:false default:true;
);–param end
rollout param_rol “Setting” width:180 –height:316
(
fn update_Fn =(
try(param_rol.deleteBt.images = #(“$Scripts/SJTools/Images//SJ_button_delete.png”, “$Scripts/SJTools/Images//SJ_button_delete_a.png”, 2, 1, 1, 2, 2)
)catch();
–アップデート時にはボタンに文字列を適応
if (targetNode != undefined) and (isvalidnode targetNode.node) then
(
–オブジェクトが有効なら
param_rol.pickBt.caption = targetNode.node.name;
)else(
–有効でないなら
param_rol.pickBt.caption = “Undefined”;
);–if end
);–fn end
label lbl1 “ターゲットオブジェクト” pos:[8,12] width:144 height:16
label lbl2 “Delay” pos:[8,68] width:40 height:16
label lbl3 “Ratio” pos:[8,92] width:40 height:16
–label lbl4 “Random” pos:[8,116] width:40 height:16
spinner delaySpn “” pos:[52,68] width:76 height:16 range:[-1e+006,1e+006,0]
spinner ratioSpn “” pos:[52,92] width:76 height:16 range:[-1e+006,1e+006,0]
–spinner ZSpn1 “” pos:[52,116] width:76 height:16 range:[-1e+006,1e+006,0]
pickButton pickBt “Undefined” pos:[8,32] width:100 height:28
button deleteBt “X” pos:[108,32] width:20 height:28 toolTip:”削除”; –images:delImg;
–////////////////////////////////////////////////
–アクション
–////////////////////////////////////////////////
on pickBt picked obj do
(
–ターゲットを格納
targetNode = (nodeTransformMonitor node:obj forwardTransformChangeMsgs:false);
pickBt.caption = targetNode.node.name;
–classOf targetNode
);–end
on deleteBt pressed do
(
targetNode = undefined;
update_Fn();
);–end
on param_rol open do
(
–アップデート
update_Fn();
);–end
);
)–end attributes
custAttributes.add $.modifiers newAttrib1;
[/as3]
少々長いが、大した内容ではない
単に、パラメーターを作って、そこに、オブジェクトを保存しているだけだ
対象オブジェクトが消えているかどうかの処置もいれてある
delay は ずれるフレーム数
ratio は アニメーションの強さ(1でターゲットと同じ)
続いて
さっきのアトリビュートの設定を拾って、
実際に値を与えてみる、こんな感じサ
[as3]
if (this.modifiers[1].targetNode != undefined) then
(
local f = currentTime – (this.modifiers[1].delay);
local v = this.modifiers[1].ratio;
–at time で指定時間からの取得
local x = at time f (in coordsys #parent(this.modifiers[1].targetNode.node.rotation.X_rotation)) * v;
local y = at time f (in coordsys #parent(this.modifiers[1].targetNode.node.rotation.Y_rotation)) * v;
local z = at time f (in coordsys #parent(this.modifiers[1].targetNode.node.rotation.Z_rotation)) * v;
(eulerAngles x y z);
)else
(
(quat 0 0 0 1)
);
[/as3]
ミソは、 at time f の部分
この部分で、ターゲットの回転値などを”ずらして”取得している
ほか、in coordsys parent とすることで、親からの参照値として計算する
その方がアニメーションが素直だ
thisとう名の変数を作っているので注意、変数がないとエラーが出てしまうのサ
ひとまず、
こんな細かい設定を
手でやらなくてもいいように
すでにできあがったシーンを
サンプルで付けておいたサ
使うときは、
【オブジェクトを構造ごとコピー】すれば、【スクリプトもコピーできる】
論より証拠、使えば分かると思う
ダウンロード:ディレイスクリプト
ほか、ろーらーを使って頂ければ
リストで一気に値が設定できるのサ
ろーらーはこちらから
ふぅ
ひとまず、ずらしの揺れ物はこれで簡単に付けられるはずだ
でも先も上げたが、
単に揺れているだけで
映像的な善し悪しは、別問題!!
注意が必要だな!
あっはっはっはっは
次回は、シミュレーションと
その”爆発力”について語っておこう
Pingback: リグ 係数とパーツ単位という考え « sakaiden