Adsense

2008年5月8日木曜日

セカンドライフのアニメーションを操る その2 (でしょう、、

前回の投稿でチャットキーボードを作ることでスクリプトによるアニメーション操作を意識した、、、と書きましたが、チャットキーボードをつくった当時は「意識」しただけで、スクリプトが何をやっているのかほとんど理解していませんでした。(笑

チャットキーボードはアニメーション理解の原点(かな?)

チャットキーボード、、、チャットをしているときにアバターがキーボードをタイプするような動き(アニメーション)をするわけですが、せっかくキーボートをタイプしているような動作をするなら、キーボードだしちゃえ!っというのが出発点で、そのうちタイプしているアニメーション自体を変更(このアニメーションの変更を Animation Override (AO: アニメーション・オーバーライド)といいます)して違う動きにしちゃおう、などなど、本来提供されている動き・アニメーションをもとにいろいろなカスタマイズができちゃうわけです。

キャット・ウォークとかセクシー・ウォーク、つまり、飛んだり、走ったりするアニメーションを違うアニメーションに入れ替える AO も、基本このチャットキーボードの仕組みと同じものです。一番はじめにこの単純な「チャットのアニメーション」を利用・変更するということにトライしたのは、今考えると最初の入り口としてはとても敷居が低くてよかったんでしょうね。

ちなみにそのとき作ったチャットキーボードは以下です、、、
0

この時、同じ「アニメーション」でも「テクスチャ・アニメーション」というものの存在を知りました。黒の背景に緑の文字がばらばらと流れるものをこのテクスチャ・アニメを使って作りました。簡単に言うと、プリムに貼り付けるテクスチャも アニメーション GIF みたいに「動きがある」ものを使うことができて、それをスクリプトの llSetTextureAnim でコントロールすることができるんですよね。llSetTextureAnim も実は奥がとっても深くて、それだけで結構ながーいエントリになるかもしれません。アニメーションだけじゃなくて、たとえば瞬時に画像を切り替えたい場合などは llSetTexture で個別の画像を切り替えるより、llSetTextureAnim と使用する複数の画像を一枚にしたものを使うと、画像切り替え時に灰色になることを避けることができたりします。もちろん、、、画像サイズにもよりますが。

(脱線、脱線、、、)話しを戻して、、、


チャットキーボードのときに参考にさせてもらったのが以下のスクリプトでした。
赤のテキストは私の補足です。
// the first free keyboard script
// by nonnux White
// free to mod, sell, erase, explode, burn :)
list anims = []; //その時点で動いているアニメーションをすべていれる空のリストを宣言
default{
    state_entry() {
        llSetTimerEvent(.2);  //0.2秒の感覚で time() を動かす=動き続けます!
    }
    timer() {
        // オーナー(使用者)の動いているアニメーションすべてを anims リストにいれる
        anims = llGetAnimationList(llGetOwner());
// "c541c47...." というアニメーションが anims リストの中にあったら...
        if(llListFindList(anims,[(key)("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9")]) != -1)
        {
// このスクリプトが入っているオブジェクト上に表示されているテキストを(この場合は)空にして
        // リンクされているオブジェクトのすべての面を表示する(Alphaを1.0にする)

            llSetText("",<1,0,0>,1);
            llSetLinkAlpha(LINK_SET,1.0,ALL_SIDES);           
        }
// "c541c47...." というアニメーションが anims リストになかったら...
        if(llListFindList(anims,[(key)("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9")]) == -1)
        {
        // テキストを空にして、すべての面を透明化(Alphaを0)する
            llSetText("",<1,1,0>,1);
            llSetLinkAlpha(LINK_SET,0.0,ALL_SIDES);
        }
    }
}
使用するスクリプトの関数は後々良く利用するものばかりでした。特に llListFindList といった List 操作系の関数は「なんらかの操作をする」場合によく使うことになりました。
でも、アニメーションを操作する、、、、ということでのここでのポイントは List 系の関数の話しではなく、
"c541c47f-e0c0-058b-ad1a-d6ae3a4584d9" というアニメーションの Key がタイピングのアニメーションを指し、llGetAnimationList はそのとき動いているアニメーションすべてをとる関数、、、ということです。

これも、、、運ですよねぇ、、、実は AO のための「今、何をしているか」を取得するスクリプトとしては、このとき私が参考にしたものよりも一般的なのは以下のような llGetAgentInfo を使う方法だと思います。if をネストしないのは浮きながらタイプする、、、など同時にその行為が行われている可能性があるからです。llWhisper の部分を上のようなオブジェクトの Alpha の操作に変えればいいわけです。(もちろん、、、このままではだめで、すでに Override しているなら何もしない、、、とかの処理が必要になります。あと、これをみたら AO って短い時間にぐるぐるまわるから、混んでいる SIM などでははずしたほうがいいことがおわかりになると思います。)

default {
    state_entry() {
        llSetTimerEvent(0.2);
    }
    timer() {
        integer bits = llGetAgentInfo(llGetOwner());
        if (bits & AGENT_TYPING) {
            llWhisper(0,"Now I'm typing!!!");
        }
        if (bits & AGENT_WALKING) {
            llWhisper(0,"Now I'm walking!!!");
        }
        if (bits & AGENT_FLYING) {
            llWhisper(0,"Now I'm flying");
        }
        if (bits & AGENT_IN_AIR) {
            llWhisper(0, "Now I'm hovering");
        }
    }
}

この方法を当時知らなかったので、逆に「"c541c47f-e0c0-058b-ad1a-d6ae3a4584d9"ってなに??」から始まり、llGetAnimationList って何???となったわけで(笑
ビルトイン・アニメーションの Key については secondlife wiki で確認することができます。(今は有志による日本語化された文書があるので、、、すばらしいですね)

でも、、、その後わかるのですが、アニメーションを操る上では、アニメーションの Key (UUID) って実はあまり使えない、、、のです。LSL は key でいろいろな操作が可能です。 llSetTexture なども貼り付けるテクスチャは、テクスチャの名前(string)だけじゃなくて、key (UUID) を指定することで利用できますが、アニメーションは llStartAnimation で Key の利用はできません。

と、、長くなってきましたが、最後に llGetAnimationList と動いているアニメーションの確認に関して。

今どんなアニメーションが動いているのかな?というのは、この関数を使わなくても確認することができます。この方法は「何が動いている?」を知るのによく使う方法ですが、もうひとつ重要なのは動いているアニメーションの優先順位を確認することができる点です。これも後々悩むのですが、ショップで売っているアニメーションの優先順位って結構バラバラだったりします。アニメーションのプロパティを見てもそのアニメーションの優先順位ってわからないんですよね。(少なくても私は、、、他の方法を見つけられてません) なので、よくダンス・アニメーションがうまく開始されていない、、、などという場合はこの方法で本当にアニメーションが開始されているか、邪魔している優先順位の高いアニメーションは他にないか(よくあるのが ポーズなどの AO をつけたままダンスを踊ろうとしている人とか、、、)を確認します。

1. Ctrl+Alt+D (Windows) で [Advanced] メニューを出します

2. [Advanced] メニューから [Character] を選び、[Animation Info] をクリックしてチェックをいれます

これだけです。
すると、画面上の「すべてのアバター」の頭の上に現在動いているアニメーション名(一部 Key)とそれぞれの優先順位が表示されます。
1
この情報を llGetAnimationList は取得してるんですよね。
で、、、、チャットキーボードを出展しましたが、ひとつも売れませんでしたね~
私はとても気に入っているので今でもつかってますけどね(笑
次にショップからアニメーションを購入して Animation Override を作ることにトライしました。といってもダンス・アニメーションじゃなくて「スタンディング・ポーズ」のアニメーションです。チャットキーボードが Typing の状況を監視してオブジェクトを出したり消したりしていたので、スタンディングの状況を監視して購入したアニメーションを開始させればいいはず、、、と考えたわけです。
このつづきは、、、その3かな?