2008年03月13日
レーダーを作ってみよう。(その2)方角表示してみる。
前回→ レーダーを作ってみよう。(その1)
ほいじゃ レーダーに8方位表示機能をつけてみましょう。
完成品のSSをもう一度。
アバター名+距離の次に8方位を表示するようにしています。
なくてもいいですがある方が断然便利なのでつけた機能です。
さてさて8方位表示・・・・・・・どします?w
今回は相対座標ベクトルを処理しています。
下図をご覧あれ。
相対座標(X,Y,Z)の出し方。
vector v = -llGetPos() + llDetectedPos(i);
でi番目のアバターの相対座標がでます。
このベクトルのX成分とY成分からΦ(ファイと読みます。ギリシャ文字)を出し、
このΦを8つの領域に場合分けすることで8方位表示しました。
Φの値は
Φ = arctan( Y / X )
で計算できます。(arctan、アークタンジェントなぞ知らねらぇ!って方はこちら → 三角法と弧度法 )
LSLでベクトル v の成分を取り出すときはC言語の構造体みたく
X成分 = v.x;
Y成分 = v.y;
とすればX成分・Y成分がfloat型で取り出せます。
てわけでLSLでベクトル v について Φの値をだすときは
float Φ = llAtan2(v.y,v.x);
でおkです。( ⇒ LSLwiki llAtan2() )
ただしこのままだとΦの値がラジアン(弧度法)なので僕的にキショクワルイです。
度数法になおします。
float Atan = RAD_TO_DEG * llAtan2(v.y,v.x);
これでめでたくΦの値をゲットできました。
この値を処理して8つに場合分けし、
それをもとに8方位表示します。
次の図を見やれ。(わりと気合いれて書いた図である)
度数法に直したΦの値を45で割って四捨五入することで
角度の円(?w)を8つの領域に分けることができます。
例えば Φ = 30.0° なら
30.0 ÷ 45 ≒ 0.666667 ⇒ 四捨五入して ⇒ 1
すなわち「NE:北東」であります。
これを踏まえてスクリプトを組んでみます。
アークタンジェントが返す値は X軸を起点 に 左まわりが正方向 であることに注意してください。
string txt;
//フローティングテキストに表示する文字列を代入する変数
vector v;
float R = 96; //センサーの範囲
default
{
state_entry()
{
llOwnerSay("Rader On");
llSensorRepeat("", "", AGENT, R, TWO_PI, 1.0);
//1秒ごとにセンサー起動
}
no_sensor()
{
llSetText("No Avator" , <1,1,1>, 1);
//センサーに何も反応がなければ No Avator と白字で表示する
}
sensor(integer total_number)
{
integer i;
integer r;
integer int;
float Atan;
string direction;
for ( i = 0; i < 8; i++ )
{
if ( llDetectedKey(i) != NULL_KEY )
{
v = -llGetPos() + llDetectedPos(i); //相対座標ベクトル
r = (integer)llVecMag(v);
Atan = RAD_TO_DEG * llAtan2(v.y,v.x); //弧度法表示
int = llRound(Atan / 45.0); //45で割って四捨五入して8つの領域に場合分け
//9つの領域番号(-4~4)に対して8方位を割り当てる。
if(int == -4)
{
direction = "[W]"; //-4と4はどっちも真西
}else if(int == -3)
{
direction = "[SW]";
}else if(int == -2)
{
direction = "[S]";
}else if(int == -1)
{
direction = "[SE]";
}else if(int == 0)
{
direction = "[E]";
}else if(int == 1)
{
direction = "[NE]";
}else if(int == 2)
{
direction = "[N]";
}else if(int == 3)
{
direction = "[NW]";
}else if(int == 4)
{
direction = "[W]";
}
txt += "No." + (string)i + " : " + direction + "\n";
//i番目に検出したアバターのいる方角を改行コードとおもに書きこんでいく
}
}
llSetText(txt, <1,1,1>, 1); //フローティングテキストに出力
txt = ""; //出力内容のクリア。
}
}
僕がこのレーダーを作ってるときに、
始めは 度数法の値をそのまま処理しようとしてたんですが
if(-180 ≦ Φ < -157.5)
{
direction = "[W]";
}else if(-157.5 ≦ Φ < -112.5)
{
direction = "[SW]";
・
・
・
・
これだとうまく動作しませんでした。
Φを直にいじる方法で正しく表示できた方がいましたら
是非コツを教えてください。
次回
レーダーを作ろう。(その3)
この記事へのトラックバックURL
ぽぴしゃん、すげぇ~
誰でもわかる説明を心がけまふ!w
(自信なし
at 2008年03月16日 02:36トラックバックしたあと、記事を削除したJvnです^^;
ぽぴーさんの記事を参考に
ジョビンバージョンのスクリプトを書いてみたんですが
掲載してもよろしいでしょうか?
at 2008年03月18日 08:56僕も参考にしたいので是非掲載してください^^
at 2008年03月18日 14:39からくりやのブログにて、コメント頂き、ありがとうございました。
おっしゃっていた、サマータイムでの時差の切り替えが大きな原因だと思います。
なので、llGetGMTclock に切り替えましたw
商品にスクリプトを使っていたので、大変助かりました。
ありがとうございます!!
レーダー、使い方考えたら色々なことが出来そうですね^^
今度、僕も作ってみようかな。。。
at 2008年03月19日 18:07センサースクリプトはいじりだすとキリがないです。w
是非面白いもの作っちゃてください。
at 2008年03月20日 11:13ようやく記事を公開したので、おひまなときにご覧ください
ありがとうございます!
at 2008年03月20日 21:07
