Adsense

2012年3月17日土曜日

[MLDU] 同一ダンスアニメーションのリピート

元ネタは Dance Queens の以下のブログ記事です。

http://sldancequeens.blogspot.jp/2012/03/repeating-dance-in-huddles.html

Nottoさんからのアドバイスは
・ 他のダンスを 0.1 秒みたいな感じで間にいれる

質問をされた方はループじゃないダンスアニメーションを最後まで再生し、もう一度同じダンスを始めから再生、そして finish の pose をさせたかったわけです。

ダンス スクリプトを書いた経験のある人は比較的早くこの問題に気が付くと思います。
現時点での Secondlife のアニメーション管理では同じアニメーションをかぶせてダンスさせることができません。

え?かぶせて?

そうなんです。おおよそダンスの「つなぎ」を重視するダンス スクリプトはノートカードで以下のように記述した場合(以下は MLDU の記述方法)、

DanceA, 8.0
DanceB, 4.0

DanceA を開始し、8秒後に DanceB を開始し、4秒後に終わる、という流れですが、スクリプト的には

・DanceA を開始
・8秒後に Dance B を開始(これを DanceB を DanceA にかぶせる、といいます)
・直後に DanceA を停止(止めるまでのインターバルはいろいろあります)
・DanceB 開始後4秒後に DanceB 停止

とします。十分にキャッシュされているとかぶせる必要はないのですが、かぶせることによってスムーズなアニメーションのつなぎが可能になります。ただし、アニメーションの優先順位には注意してください。優先順位の低いアニメーションだとかぶせても優先度の高いアニメーションが再生されたままになります。

この仕組みを採用しているダンス HUD だと、同じアニメーションの繰り返しができません。
なぜなら、DanceB を DanceA と置き換えると

・DanceA を開始
・8秒後に DanceA を開始
(同じアニメ―ションなのでDanceA は再スタートされない)
・直後に DanceA を停止
(DanceA は一個しか動いていないので、最初に開始した DanceA が停止)
・再スタートされなかったところから4秒後に DanceA 停止
(アニメーションリストチェックしていればスルー、していなければ DanceA がないためスクリプトエラー)

実は MLDU ではこのリピートの扱いについて MLDU4 と MLDU5 では変えています。

MLDU4 では忠実にユーザーの指定通りにアニメーションを再生しようとしていました。DanceA の次に DanceA をユーザーが指定したときには

・DanceA を開始
・数秒後に DanceA を開始
・もし、今踊っているダンスと開始するダンスが同じならば現在のダンスを停止
・DanceA を開始

というシーケンスにしています。よって、一瞬ダンスがとまります。もしくは立ち位置がかわります。

しかし、MLDU5 にてシーケンスダンスもしくは組みダンスを構成している場合は、同じダンスを踊り続けながらポジションや向きを変えたい、という要望があったため、この仕様を撤廃しました。MLDU5 を選んでくれたユーザーさんは「同じダンスを繰り返したい」というニーズより「同じダンスを踊り続けながら位置・向きを変えたい」というニーズのほうが重要とみなしたからです。

ですので、以下のようなノートカードの場合、DanceA のアニメーションが24秒とした場合、

DanceA, 8.0, 位置A, 向きA
DanceA, 8.0, 位置B, 向きB
DanceA, 8.0, 位置C, 向きC

DanceA は24秒間踊り続けますが、8秒ごとに位置と向きが A –> B –> C と変化します。

MLDU4 は同一アニメーションへの再開始対応をしていますが、MLDU5 は上述の理由で再開始対応をしていません。次のダンスを開始し、前のダンスを止めるまでのインターバルはスクリプト内で固定値 (0.5秒) としていますが、これは前のダンスと今のダンスが「違う」場合のみ、アニメーションをかぶせてインターバル後に停止しています。そのため、0.1 秒の短い「違う」ダンスをいれると、インターバル(0.5秒)分は長く「違うダンス」を踊ってしまいます。

0.5 を短くすればいいのですが、0.5 によるダンスを踊らない「棒立ち時間」を回避できるのです。とくにキャッシュが十分にされているはずでも、SIM のアバタ―数などが多くなってくると、SIMおよびビューワー側のキャッシュが足りなくなり一度おどったはずなのに一瞬止まることが発生します。私はそちらのほうを優先して解決しようとしたわけです。

ま、、、インターバルは直せるのでご希望の方はインワールドでノートくださいね。(でも、おすすめはしません~)

TBS