LSL関数の使い方 第79回 カメラ制御編(2)許可情報の取得(llGetPermissions)

PR
許可情報を取得するには、llGetPermissionsを使用します。

●関数解説
llGetPermissions
・概要
llGetPermissions関数は、以下の許可情報を取得します。

お金を支払う許可
キー操作の許可
アニメーションの実行許可
アタッチの許可
リンクの許可
カメラ位置を取得する許可
カメラを制御する許可
・書式
integer llGetPermissions()
・パラメータ
なし
・戻り値
以下の許可情報が返ります。

PERMISSION_DEBIT
PERMISSION_TAKE_CONTROLS
PERMISSION_TRIGGER_ANIMATION
PERMISSION_ATTACH
PERMISSION_CHANGE_LINKS
PERMISSION_TRACK_CAMERA
PERMISSION_CONTROL_CAMERA

・使い方
LlGetPermissions関数を用いて、許可情報を取得して、現在必要な許可がされていなければ、LlRequestPermissions関数で許可申請を行います。

// 許可情報を取得
integer perm = llGetPermissions();

// ビット演算のAND(論理積)を用いて許可情報から必要な許可を調べます
if (perm & PERMISSION_TRACK_CAMERA){
...
}

AND(論理積)
┌─┬─┬───┐
│a │b │a & b │許可情報 必要な許可
├─┼─┼───┤
│0 │0 │  0   │不許可   不許可     不許可
│0 │1 │  0   │不許可   許可       不許可
│1 │0 │  0   │許可     不許可     不許可
│1 │1 │  1   │許可     許可       許可
└─┴─┴───┘

2つのビットが両方1のときだけ出力が1になる(乗算に似ている)
0x6A & 0x0F → 0x0A

   0000 0000 0110 1010 --- 0x6A
&) 0000 0000 0000 1111 --- 0x0F
  -----------------------
   0000 0000 0000 1010 --- 0x0A
              ↑マスク(強制的に0)

●サンプル
アバターの正面にカメラを移動させるサンプルです。
サンプルを実行した時にカメラが移動しない場合は、Alt + Zoom などで、カメラコントロールが支配されている状態にあります。
ESCキーを2回押して、カメラコントロールを解放すると、正常動作します。
この動作は、カメラコントロールの仕様なので、覚えておきましょう。

set_camera(vector vPos, vector vFwd){

    // 許可情報を取得
    integer perm = llGetPermissions();

    // ビット演算のAND(論理積)を用いて許可情報からカメラ制御の許可があるか調べます
    if (perm & PERMISSION_CONTROL_CAMERA) {

        // 許可があればカメラのパラメータをセットします
        llSetCameraParams([
            CAMERA_ACTIVE, TRUE,
            CAMERA_POSITION, vPos + vFwd, 
            CAMERA_POSITION_LOCKED, TRUE,
            CAMERA_FOCUS, vPos,
            CAMERA_FOCUS_LOCKED, TRUE
        ]);
    }   
}

front_camera(){
    vector vFwd = llRot2Fwd(llGetRot());
    vFwd += vFwd;
    vector vPos = llGetPos();
    set_camera(vPos,vFwd);
}

default
{
    state_entry(){
        if (llGetAttached() != 0){
            llRequestPermissions(llGetOwner(), PERMISSION_CONTROL_CAMERA);
            front_camera();
        }
    }

    attach(key agent){
        if (agent != NULL_KEY){
            llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
            front_camera();
        }else{

            // 許可情報を取得
            integer perm = llGetPermissions();
            // ビット演算のAND(論理積)を用いて許可情報からカメラ制御の許可があるか調べます
            if (perm & PERMISSION_CONTROL_CAMERA){
        // 許可があればカメラのパラメータをクリアします
                llClearCameraParams();
                llReleaseCamera(llGetPermissionsKey());
            }
        }
    }

    on_rez(integer param){
        llResetScript();
    }
}


■参照

llRequestPermissions
llGetOwner
llSetCameraParams
llGetAttached
llGetRot
llRot2Fwd
llClearCameraParams
llGetPermissionsKey
Ads by Google

SLguide.jp 最新スポット情報