はい、こんにちは。わたくしです。
今回は自分がスクリプトを書く際によく使うものを忘れないように記述しとこうと思います。
ちなみにわたくしはプラグラムなんぞSL以外ではまったく使わないので一般の方がすでに知ってるだろうことしか書けません。あくまでの自分のための忘備録として書きます。
今回は2つの座標系についてです。
SLでは座標系が2つあります。
1.ワールド座標
これはsimの東西南北がxyz座標に対応しているものです。
2.ローカル座標
これはアバタやオブジェクトの上下左右がxyz座標に対応しているものです。
やっかいなのがこのローカル座標です。
ローカル座標ではアバタ(オブジェクト)の正面がx、左がy、上方がzです。
アバタやオブジェクトは向きを変えることで上下左右の方向も変わります。
ある位置のアバタが右へ向けばさっきまでの正面の方向も右に変わります。
だからややこしい。
しかし便利な命令が用意されています。
それが以下の3つ。
llRot2Fwd
llRot2Left
llRot2Up の3つです。
それぞれ上から順にアバタ(オブジェクト)の正面(x座標)の値を左側(y座標)の値を上方(z座標)の値の単位ベクトルを取得してくれます。
単位ベクトルは長さが1mのベクトルです。
つまりllRot2Fwd(llGetRot());と書けばいつでもアバタ(オブジェクト)の正面(x座標)の向きを取得してくれます。
単位ベクトルなので=<1,0,0>ですね。
llRot2Fwd(llGetRot());を書くことでアバタ(オブジェクト)がどの向きを向こうが、その正面がx座標になってくれるのです。
同様にllRot2Left(llGetRot());を書くことでアバタ(オブジェクト)がどの向きを向こうが、その左がy座標になってくれるのです。
便利だ。
これはわたくしが多用する命令llRezObjectを使うときにとても役に立ちます。
llRezObjectはオブジェクトからさらにオブジェクトを出す命令です。
llRezObject(string inventory, vector pos, vector vel, rotation rot, integer param)
・string inventory 出されるオブジェクトの名前
・vector pos どの位置に出すかの場所
・vector vel 出されるオブジェクトのスピード
・rotation rot 出されるオブジェクトの角度
・integer param なぜか分からないけど1にしとけばいいらしいとなりますね。
ここで問題なのがvector posです。
これはワールド座標系での位置です。
このままだとオブジェクトを右に回転したときなど違う方向に回転したときでもこれをローカル座標にしてない限り、同じ方向にREZされてしまいます。
なのでここで上記のllRot2Fwdなどを使います。
llGetPos() + llRot2Fwd(llGetRot())としておけば、オブジェクトの今の位置プラスその正面方向の<1,0,0>の位置にREZしてくれます。
例として
タッチしたときにオブジェクトがどんな方向に向こうが必ず正面にREZされるスクリプト
を書きます。
============================================
default{
touch_start(integer x){
llRezObject("hana",
llGetPos() + llRot2Fwd(llGetRot()),
llRot2Fwd(llGetRot())*30,
ZERO_VECTOR,
1);
}
}
============================================
【追記】 vector velは出されるオブジェクトの速度で物理オブジェクトのときのみ有効。
ベクター値なのでllRot2Fwd(llGetRot())*30のように書く。
この場合、向きはアバタ(オブジェクト)の正面方向で大きさは<30,0,0>となる。
30の部分をいじって速度を変化させるといい。
こちらのブログもよろしくお願いします。 ブロガーの方のやつ
3 コメント:
なにこれすごいwww
ゴンゾって頭よかったんやねぇ~(´∀`*)
最近ゴンゾの姿を見ないんだが、ゴンゾはどうしてるんだ?と、一部で話題になっています。
そしてこれはだいぶ参考になりました。
この正面rezのやつ、メモメモφ(・ω・`)...ポキ!☆_/o(゚ω゚`)!!
最近、モノ作り始めて、簡単な家を作っているんだけど、分るわ~、
ローカル座標がウザイのって!ww
横を伸ばしてるのに縦が伸びたり・・・ダラダラ━(il`・ω・´;) ━ダラダラ
おかげでグッチャになってるでwww
コメントを投稿