ソラマメブログ
河原町 =Shop eL=(ぇる)1号店=
Niseko3 =Shop eL=(ぇる)3号店=
裏原宿 Mad Scripter's Lab
姉妹サイト Mad Scripter's Lab

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

http://masterpoppy.slmame.com/t172204
この記事へのトラックバック
こんばんは、ジョビンです。あしあとをたどってみたら MasterPoppy Amat さんという方がセンサースクリプトを公開されていました。http://masterpoppy.slmame.com/e172204.htmlなるほどなるほど。こうや...
【中級】センサースクリプトに挑戦【If SL = RL then ..】at 2008年03月20日 21:06
この記事へのコメント
21-19=3 でおk?w
Posted by あさみりとる at 2008年03月13日 19:34
???@@(´・ω・`)@@???

ぽぴしゃん、すげぇ~
Posted by スノー♪ at 2008年03月14日 06:35
マニアックすぎたかな(^^;

誰でもわかる説明を心がけまふ!w
(自信なし
Posted by MasterPoppy AmatMasterPoppy Amat at 2008年03月16日 02:36
すみません
トラックバックしたあと、記事を削除したJvnです^^;

ぽぴーさんの記事を参考に
ジョビンバージョンのスクリプトを書いてみたんですが
掲載してもよろしいでしょうか?
Posted by Jvn WriterJvn Writer at 2008年03月18日 08:56
>Jvnさん

僕も参考にしたいので是非掲載してください^^
Posted by MasterPoppy AmatMasterPoppy Amat at 2008年03月18日 14:39
記事と違う内容のコメント、失礼いたします。
からくりやのブログにて、コメント頂き、ありがとうございました。
おっしゃっていた、サマータイムでの時差の切り替えが大きな原因だと思います。
なので、llGetGMTclock に切り替えましたw
商品にスクリプトを使っていたので、大変助かりました。
ありがとうございます!!

レーダー、使い方考えたら色々なことが出来そうですね^^
今度、僕も作ってみようかな。。。
Posted by akitoakito at 2008年03月19日 18:07
>akitoさん

センサースクリプトはいじりだすとキリがないです。w

是非面白いもの作っちゃてください。
Posted by MasterPoppy AmatMasterPoppy Amat at 2008年03月20日 11:13
快諾してくださってありがとうございます^^
ようやく記事を公開したので、おひまなときにご覧ください

ありがとうございます!
Posted by Jvn WriterJvn Writer at 2008年03月20日 21:07
認証文字を入力してください