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

センサーでペットをつくろう(llMoveToTarget,llRotLookAt関数)

前にご紹介したスクリプトTipsセンサーを使うの応用編です。
ペットをつくってみました。
オブジェクトTouchするとタッチしたアバターの近く(アバターからX軸に-0.5mY軸に-0.5mの場所)をついてまわります。
飛んでも、そばについてきます。

ライブラリの中に目玉を作るときのテクスチャがあったので、
これを利用して目玉のペットを作ることにしました。

下記のスクリプトを使います。

vector vpos;
default
{
  touch_start(integer total_number)
  {
      vpos = llGetPos();
      llSetStatus(STATUS_PHYSICS,TRUE);
      llSensorRepeat("", llDetectedKey(0), AGENT, 30, TWO_PI, 3.0);
  }
  sensor(integer total_number)
  {
      llMoveToTarget(llDetectedPos(0) + <-0.5,-0.5,0.0>, 0.2);
      llRotLookAt(llDetectedRot(0), 0.5, 0.5);
  }
  no_sensor()
  {
      llMoveToTarget(vpos, 0.2);
      llSensorRemove();
  }

}
llMoveToTarget関数:llMoveToTarget(vector target, float tau)
一番目のパラメータ : 目標地点
二番目のパラメータ : 秒数
目標地点まで、指定秒数かけて移動します。(これで、Touchしたアバターの近くに移動です。)
llRotLookAt関数:llRotLookAt(rotation target, float strength, float damping)
一番目のパラメータ : 目標回転
二番目のパラメータ : 強さ(物理オブジェクトの場合は、0.2から1.0)
三番目のパラメータ : 減衰(物理オブジェクトの場合は、0.2から1.0)
目標回転まで、指定秒数かけて移動します。(これで、Touchしたアバターと同じ方向を向きます。)
llSensorRemove関数:llSensorRemove()
センサーを停止します。
no_sensorイベント
センサーに反応がないときのイベントです。
(Touchアバターがログオフやテレポートした場合、センサーを停止して元の場所に戻ります。)

<補足>
SIMを超えての移動や、オブジェクトが入る許可のない土地には入れません。
その場合は、ペットが停止してしまいます。自分の土地で飼ってあげてください。
また、ペットの回転軸によってアバターとの向きがあわない場合は、llRotLookAtの行を
下記のようにXYZの回転度数を調整するといいかと思います。
(Z軸に90度回転させた例)
llRotLookAt(llDetectedRot(0) * llEuler2Rot(<0.0,0.0,90.0> * DEG_TO_RAD) ,0.5, 0.5);