プログラミングはまったくわからないため、お役に立てるかどうかわかりませんが、こんなスクリプトを書きました。OpenSimにて動作確認済みです。
// llLookAtの動きを疑似的に再現するスクリプト。
// ここでは「targetprim」という名前のオブジェクトを、0.5秒おきに検知し、
// llSetRotで能う限りの速度と強さ(?)で「上」(z軸の正方向)の面をそちらへ向けます。
// 具体的には検出された対象物と自身の座標(と距離)から、
// 仰角と平面上の向きを別々に計算し、これを合成して回転させています。
float range = 60; // 検知できる距離(メートル)
float rate = 0.5; // スキャンの頻度(秒)
vector updown; // 真上が< 0.0, 0.0, 0.0 >
vector flatrad;
default
{
state_entry()
{
llSensorRepeat( "targetprim", "", PASSIVE, range, PI, rate );
}
sensor( integer num_detected )// 目標を検知したら
{
vector targetpos = llDetectedPos( 0 ); // 目標の位置を取得
vector mypos = llGetPos(); // 自身の位置を取得
float distance = llVecDist(targetpos, mypos); // 目標までの距離を取得
if(distance > 0)
{
updown = <0.0, llAcos((targetpos.z - mypos.z) / distance), 0.0>; // 目標との高低差と距離から仰角を取得(ラジアン)
float ew = (targetpos.x - mypos.x); // 両者のx座標の差と
float ns = (targetpos.y - mypos.y); // y座標の差より
flatrad = <0.0, 0.0, llAtan2(ns , ew)>; // 平面上の向きを計算(ラジアン)
rotation rot1 = llEuler2Rot(updown);
rotation rot2 = llEuler2Rot(flatrad);
llSetRot(rot1 * rot2); // クォータニオンに変換後、回転を合成して適用
}
}
}