Yes Second Life

セカンドライフに早9年、現役セカンドライファーの考えてること

セカンドライフ Animesh 基本編

この記事はセカンドライフ技術系アドベントカレンダー2019向けの記事です。

セカンドライフ技術系 Advent Calendar 2019 - Adventar

アバターでなくオブジェクトをアニメーションさせるAnimeshという機能があるんですが、まとまった日本語情報がなかったので今回紹介しようとおもいます。

Animeshとは

以前から骨組みが入ったメッシュであるリグドメッシュをアバターとして使うことができたんですが、それをオブジェクトとして配置してアニメーションさせる機能がAnimeshです。

今まではオブジェクトはスカルプアニメくらいしかなかったのですが、本格的なアニメーションをつけることができるようになったので、NPC的な使い方をしたり応用次第で色々な演出ができます。

Animeshの関数

Animesh関連の関数は3つしかありません。

llStartObjectAnimation

引数で渡された名前のアニメーションをインベントリから探して再生します。

llStopObjectAnimation

引数で渡された名前のアニメーションを停止します。

llGetObjectAnimationNames

現在再生されているすべてのアニメーションをリストで返します。

たとえばこれらを組み合わせて、すべてのアニメーションを停止する関数とかつくれます。

stopAllAnimation()
{
    list animList = llGetObjectAnimationNames();
    integer length = llGetListLength(animList);
    integer i = 0;

    while (i < length)
    {
        string anim = llList2String(animList, i);
        llStopObjectAnimation(anim);
        i++;
    }
}

試してみるには

昔作ったリグドメッシュで試してみたんですが、なぜかうまくいきませんでした。セカンドライフにはAnimeshを試すためのサンドボックスが用意されているので、とりあえずそこに行ってみるとAnimesh対応のリグドメッシュが配布されていました。
Second Life Maps | Animesh1

f:id:sabro:20191201002829p:plain
Rezすると勝手に動き出しますがタッチすると停止します。停止させてからオブジェクトの中身を削除すればお試し用のまっさらなリグドメッシュをゲットできます。

スクリプトサンプル

とりあえず、簡単なスクリプトを書いてみました。

integer isPlaying = FALSE;

default
{
    state_entry()
    {
        llStopObjectAnimation("walk");
    }
    
    touch_start(integer total_number)
    {
        if(isPlaying)
        {
            llStopObjectAnimation("walk");
            isPlaying = FALSE;
        }
        else
        {
            llStartObjectAnimation("walk");
            isPlaying = TRUE;
        }
    }
}


はっきりいって、すごく簡単ですね。リグドメッシュさえあれば、誰でもアニメーションするオブジェクトをつくれます。人がいなくて寂しいシムにも動きをだせるんじゃないでしょうか( ̄∇  ̄ )