LSL(Linden Script Language)スクリプトTips集

カメラを制御する(llSetCameraParams,llClearCameraParams関数)

前回動画の再生をご紹介したので、もっとちゃんとした動画をとりたいなーと思い、
カメラ制御のスクリプトに興味をもったのでご紹介します。
下記のスクリプトでは、(カメラのつもり・・・です)装着して歩くとアバターの視点(カメラの視点)が変わります。

通常、カメラは自アバターの少し後ろをついてきます。自分の顔をみながら歩くことはできません。
このオブジェクト(カメラのつもり・・・です)を装着して歩くと、自分の正面をみながら歩くことが可能です。

default
{
  state_entry()
  {
      if (llGetAttached() != 0){
          llRequestPermissions(llGetOwner(), PERMISSION_CONTROL_CAMERA);
      }
  }
  attach(key agent)
  {
      if (agent != NULL_KEY){
          llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);
      }else{
          integer perm = llGetPermissions();
          if (perm & PERMISSION_CONTROL_CAMERA){
              llClearCameraParams();
          }
      }
  }
  run_time_permissions(integer perm)
  {
      if (perm & PERMISSION_CONTROL_CAMERA) {
          llClearCameraParams();
          llSetCameraParams([ CAMERA_ACTIVE, TRUE,
          CAMERA_BEHINDNESS_ANGLE, 180.0]);
      }
  }

}
llGetAttached関数:llGetAttached()
どこに装着されているかを取得します。(0は装着してないということです。)
装着されている場合は例えば、
ATTACH_CHEST
ATTACH_HEAD
ATTACH_LSHOULDER
ATTACH_RSHOULDER
ATTACH_LHAND
・・・というように装着部位名称がATTACH_XXXXのXXXXの部分になった定数値が取得できます。定数の参考ページ
llSetCameraParams関数:llSetCameraParams(list rules)
一番目のパラメータ : CAMERA_XXXXフラグ
CAMERA_ACTIVE カメラをアクティブにするかどうか(TRUEまたはFALSE )
CAMERA_BEHINDNESS_ANGLE カメラが目標(アバター)の回転に変化によって抑制されない角度(0 to 180 )
CAMERA_BEHINDNESS_LAG ビハインドネスに反応する遅れ(0 to 3 )
CAMERA_DISTANCE カメラの距離(0.5 to 10 )
CAMERA_FOCUS カメラフォーカス
CAMERA_FOCUS_LAG フォーカスに反応する遅れ(0 to 3)
CAMERA_FOCUS_LOCKED フォーカスをロックするかどうか(TRUEまたはFALSE )
CAMERA_FOCUS_OFFSET フォーカス位置<-10,-10,-10> to <10,10,10>
CAMERA_FOCUS_THRESHOLD フォーカスの動きで影響されない半径(0 to 4 )
CAMERA_PITCH カメラの回転角度(-45 to 80 )
CAMERA_POSITION_LAG ポジションに反応する遅れ(0 to 3)
CAMERA_POSITION_LOCKED カメラ位置をロックするかどうか(TRUEまたはFALSE )
CAMERA_POSITION_THRESHOLD 対象の動きで影響されない半径(0 to 4 )
llClearCameraParams関数:llClearCameraParams()
カメラの設定値をデフォルトに戻します。
attachイベント:attach(key agent)
アイテムを装着するとき、または取り外した時に発生します。
装着したときにはアバターのキー、取り外した時にはNULL_KEYが、agentパラメータから取得できます。

<補足>
アバターのカメラを制御する為にはパーミッション(PERMISSION_CONTROL_CAMERA)が必要になります。
今回のサンプルでは、カメラをアクティブにして、
カメラが目標(アバター)の回転に変化によって抑制されない角度を180度に設定しています。
state_entryでは、オブジェクトを装着したままスクリプトがリセットされた場合も
カメラ制御を再セットするようにしています。
llSetCameraParams関数のパラメータを変えることによって、頭上から撮影したり、横から撮影したりも可能なので
セカンドライフで動画(マニシマ)をとるとき等に便利そうです。