Adsense

2012年5月1日火曜日

[LSL] 前に動いて、横に動いて、基本は rotation

備忘録的メモになります。

llSetPos でも、llSetLinkPrimitiveParamsFast でもいいんですけど、プリムを移動させる、動かすために、最終的にはグローバル座標軸における X, Y, Z の値をいれることになります。

llSetLinkPrimitiveParamsFast での子プリムの移動においてはルートプリムからの相対位置ですが、単純にプリムを動かすことを考えると、グローバル座標を指定することになります。

おおよそ「今いる位置から移動させる」場合は、「今向いている方向」をベースに考えます。「今向いている方向」で、前にいこう、後に行こう、右に、左に、上に、下に、、、となるわけです。

すると、今向いている方向は rotation r0 = llGetRot() でローテーション(クォータニオン)型で取得できます。今向いている方向で前に 1m 進むためのグローバル座標軸における移動分は llRot2Fwd(r0) でベクトル型の X, Y, Z の値を取得できます。2.5m 進みたかったら llRot2Fwd(r0)*2.5 です。

3m 前に進み、左に2m 移動する場合は llRot2Fwd(r0) *3.0 で 3m 前進するためのグローバル座標軸上の移動と、llRot2Left(r0)*2.0 で 2m 左に進むためのグローバル座標軸上の移動が必要なります。現在の位置から 3m 前進し、2m 左に動く vector v は

vector v = llRot2Fwd(r0)*3.0 + llRot2Left(r0)*2.0;

です。ただし、これは移動分であり、最終的な SIM 上のグローバル座標ではないので

vector tgV = llRot2Fwd(r0)*3.0 + llRot2Left(r0)*2.0 + llGetPos();

がグローバル座標軸上のベクトル情報になります。llSetPos(tgV) で、今の位置から前に 3.0m、左に 2.0m いった地点に動きます。

ここに今向いている方向をZ軸(上下軸)に90度に左周り(上から見て反時計まわり)、そこから前に2m、左に3m移動する場合は、まず自分の向きを変えます。ただし、この向きの変更はローカル座標軸(自分の前後左右上下の軸)に対して行うのがほとんどです。よって、90度の回転は左からクォータニオンを現在の向きにかけてあげます。

rotation r1 = llEuler2Rot(<0.0,0.0,90*DEG_TO_RAD>)*llGetRot();

r1 は今の向きから90度左まわりにまわった向きになるので、そこから前、横のベクトル値を算出します。

vector v = llRot2Fwd(r1)*2.0 + llRot2Left(r1)*3.0;

現在の位置をプラスすることで最終的な SIM 上のベクトル値となります。

vector tgV1 = v + llGetPos();

<X, Y, Z> のベクトル側の要素に数値を直接プラスすることはあまり無いんですよね。。。
これ、しばらくやっていないと、忘れます。。。><