ソラマメブログ › 鳥頭の雑記帳 › スクリプト › 回転座標の算出方法

2010年06月04日

回転座標の算出方法

回転座標の算出方法
回転座標の算出方法
回転座標の算出方法
オブジェクトRezをスクリプトで書くときに、あらかじめ座標設定しておいても、
本体を回転させてしまうと、本体との位置関係が狂ってしまいます。

で、本体が回転したなら、それを追従した形でRezしたいわけですが、
LSLにそんな便利な関数はないので、作ってみました。

●       ●
↑   が      ではなく、 
■     ← ■          ● ← ■ となるようにしたい。(■が左90度回転した)

※ Z軸方向の回転しか考慮していません。

// 回転座標値算出 引数:中心座標, 目的座標, 回転値
vector fncRotPoint(vector vctCenterPos, vector vctTargetPos, rotation rotAngel)
{
// 回転値をVector型に変換して保持
vector vctBuff = llRot2Euler(rotAngel);
// Z軸の回転値を抽出  
float fltAngle = vctBuff.z;

// 中心座標と目的座標の差分を算出 ※ X,Yの長さを計算
float XL1 = vctTargetPos.x - vctCenterPos.x;
float YL1 = vctTargetPos.y - vctCenterPos.y;

// 三角関数で回転座標を計算
float X2 = vctCenterPos.x + llCos(fltAngle) * XL1 - llSin(fltAngle) * YL1;
float Y2 = vctCenterPos.y + llSin(fltAngle) * XL1 + llCos(fltAngle) * YL1;

vector vctRtn = *1; // Z軸の高さはそのまま返す(考慮していない)
return vctRtn;

}
*1 = <X2,Y2,vctTargetPos.z>です。タグと判断して、Web表示されないようです。
   ここでは「<」を全角にすることで表示させています。コピペ時注意

これで、回転座標を算出できます。

座標は回転したように算出されますが、RezオブジェクトそのもののZ軸角度は
無回転のまま座標を設置するので、RezオブジェクトのZ軸の角度に本体が
回転した回転値を足して(LSL的には乗算して)あげる必要があります。

まぁ、これ見て分かる人なら、たぶん、考慮できるでしょうw

三次元的な回転も考慮したい場合は、どうやるんでしょうねぇ・・・
私の頭ではこれが限界!でも、たぶん、方法はあるw



同じカテゴリー(スクリプト)の記事画像
テレポーターが動かない人へ
スクリプト教室 卒業制作 作品紹介 その14
スクリプト教室 卒業制作 作品紹介 その13
スクリプト教室 卒業制作 作品紹介 その12
スクリプト教室 卒業制作 作品紹介 その11
スクリプト教室 卒業制作 作品紹介 その10
同じカテゴリー(スクリプト)の記事
 テレポーターが動かない人へ (2012-01-02 19:08)
 スクリプト教室 卒業制作 作品紹介 その14 (2011-11-11 23:11)
 スクリプト教室 卒業制作 作品紹介 その13 (2011-11-07 23:15)
 スクリプト教室 卒業制作 作品紹介 その12 (2011-11-05 22:04)
 スクリプト教室 卒業制作 作品紹介 その11 (2011-11-01 23:13)
 スクリプト教室 卒業制作 作品紹介 その10 (2011-10-30 15:49)

Posted by karasu blackburn at 22:48│Comments(5)スクリプト
この記事へのコメント
おひさです~~~!!

3次元の回転、、難しすぎる。。。
Posted by まき at 2010年06月06日 22:03
まいど~
回転行列か、四次元数で処理することはなんとなくわかるけど、実際にコードに落とすのは難しそうw

http://www015.upp.so-net.ne.jp/notgeld/quaternion.html
ここに別言語のソースがあるので、解析するしか無いですね。
Posted by karasu blackburn at 2010年06月07日 12:35
めんどくさい事してますねw
rezの際の座標はrezzerからのオフセットを渡すので、
そこにrezzerの角度で修正行うだけですよ。

 vector v = llGetPos();//オフセット
 rotation r = llGetRot();//rezzerの回転角

 llRezObject("Object",v*r,ZERO_VECTOR,r,0);

こんな感じね。
Posted by Maaya Yokoh at 2010年08月06日 01:38
あひゃw ちょ〜ミス。

 vector v = <0.0,1.0,0.0>; //横+1mの位置

とかだね。オフセットなのにgetしちゃあかんw
Posted by Maaya Yokoh at 2010年08月06日 01:41
rotation rotFacing = llGetRot(); // オブジェクトの現在のrotationを得る
vector offset = <0, 1, 0>; // localのY方向へ正の向きに1mのオフセットを作成する
vector rotatedOffset = offset * rotFacing; // 対応するオブジェクトの回転へオフセットを回転する
vector correctOffset = llGetPos() + rotatedOffset; // ローカルオフセットのregion上の位置を得る
llRezObject("Object",correctOffset,ZERO_VECTOR,rotFacing,0);

こういうことですね、なるほど。
言われてみれば、オイラーなんだからできるわなぁ
うはー、無駄な時間を費やした~~~!
Posted by カラス at 2010年08月06日 02:44
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。