Yes Second Life

セカンドライフ向けWebサービスを作ってました。このブログではVR・メタバースのことを書いていきます

アニメーションオーバーライドできる新関数

セカンドライフアバターのデフォルトの歩いたり座ったりするアニメーションは、今までは基本的に上書きするのにハックが必要でした。タイマーをコンマ数秒単位で回して、アバターの状態を監視する方法です。しかしこれはシムへの負荷がかなり掛かるものでした。

そこで最近、負荷を抑えつつアニメーションを上書きできる新関数が追加されました。

llSetAnimationOverride

llSetAnimationOverride( string anim_state, string anim )

llSetAnimationOverrideは、アニメーションを上書きします。第1引数は「上書きする状態」、第2引数は上書きするアニメーションの名前です。例えば、歩く動作をしているとき座るアニメーションを再生したい場合は、次のようにします。

default
{
    touch_start(integer num)
    {
        // パーミッションを取得
        llRequestPermissions(llDetectedKey(0), PERMISSION_OVERRIDE_ANIMATIONS);
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_OVERRIDE_ANIMATIONS)
        {
            // 歩く動作のとき、座るアニメーションをさせる
            llSetAnimationOverride("Walking", "sit");
        }
    } 
}

上書きできる状態は、これだけあります。

  • Crouching
  • CrouchWalking
  • Falling Down
  • Flying
  • FlyingSlow
  • Hovering
  • Hovering Down
  • Hovering Up
  • Jumping
  • Landing
  • PreJumping
  • Running
  • Sitting
  • Sitting on Ground
  • Standing
  • Standing Up
  • Striding
  • Soft Landing
  • Taking Off
  • Turning Left
  • Turning Right
  • Walking

アニメーションは、基本的にはプリムに格納しておいて、その名前を第2引数で指定するのですが、組み込みアニメーションであれば、プリムになくても使用できます。上記のサンプルも組み込みアニメーションを使いました。

llGetAnimationOverride

llGetAnimationOverride( string anim_state )

llGetAnimationOverrideは、いま再生しているアニメーションの名前を取得できます。引数には、アニメーションの名前を取得したい状態を指定します。歩いているときは、普段は「walk」というアニメーションが再生されていますが、さっきのllSetAnimationOverrideのサンプルを実行したあとで以下のスクリプトを動かすと、「sit」と表示されます。

default
{
    touch_start(integer num)
    {
        // パーミッションを取得
        llRequestPermissions(llDetectedKey(0), PERMISSION_OVERRIDE_ANIMATIONS);
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_OVERRIDE_ANIMATIONS)
        {
            // 歩いているときに再生されているアニメーションの名前を取得
            llOwnerSay(llGetAnimationOverride("Walking"));
        }
    }
}

llResetAnimationOverride

llResetAnimationOverride( string anim_state )

現在指定されているアニメーションを、デフォルトのものにリセットします。引数にはアニメーションをリセットしたい状態を指定します。llSetAnimationOverrideのサンプルを実行したあとで、次のスクリプトを動かすと、歩くときのアニメーションが「walk」にもどります。

default
{
    touch_start(integer num)
    {
        // パーミッションを取得
        llRequestPermissions(llDetectedKey(0), PERMISSION_OVERRIDE_ANIMATIONS);
    }
    
    run_time_permissions(integer perm)
    {
        if(perm & PERMISSION_OVERRIDE_ANIMATIONS)
        {
            // 歩いているときに再生されているアニメーションをデフォルトにもどす
            llResetAnimationOverride("Walking");
        }
    }
}

なお、llResetAnimationOverrideだけ引数に「ALL」が指定でき、すべてのアニメーションをリセットすることができます。

自分で何かつくるときはもちろん、既存のアニメーションオーバーライドツールを使う時も、できれば新しい関数を使って負荷をへらしているかチェックしてみるといいかもしれませんね( ̄∇  ̄ )