ソラマメブログ

2008年03月14日

【中級】センサースクリプトに挑戦

こんばんは、ジョビンです。

あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html

なるほどなるほど。
こうやって方角を検知するんですね。

トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。


ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。

ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。

やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。


// Work Space
vector direc_v;
integer dirc_idx;
string Text;
string line;
integer dist;

// Constant Value
list dirc_list = ["W","SW","S","SE","E","NE","N","NW"];
float RAD_TO_IDX;

default
{
on_rez(integer n){ llSetText("",<0,0,0>,1.0); llResetScript(); }

state_entry()
{
RAD_TO_IDX = 8 / (TWO_PI);
llSensorRepeat("", "", AGENT, 500, TWO_PI, 3.0);
}

sensor(integer num)
{
Text = "";
integer i;
for(i=0; i {
direc_v = llDetectedPos(i) - llGetPos();
dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7

dist = llRound(llVecMag(direc_v));

line += llDetectedName(i);
line += "[";
line += (string)dist+"m ";
line += llList2String(dirc_list,dirc_idx%8);
line += "]";
Text += line + "\n";
}

llSetText(Text, <1.0,1.0,1.0>, 1.0);
}

no_sensor()
{
llSetText("NO AVATAR", <0.8,0.5,0.5>, 1.0);
}

changed(integer c)
{
if(c & CHANGED_TELEPORT)
llSetText("",<0.0,0.0,0.0>,1.0);
}
}



テストはしていないので、動作は保障しません。
動かした方、結果を教えていただければ幸いです。


実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;


ポイント




dirc_idx = llRound(llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4); // dirc_idx = 0 ~ 7


違いはこの行だけです。
分解して順番に見ていきましょう。


llAtan2(direc_v.y,direc_v.x)


この行は 元のソースのままです。
値は - PI ~ PI になります


llAtan2(direc_v.y,direc_v.x)/TWO_PI


こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?


llAtan2(direc_v.y,direc_v.x)/TWO_PI*8+4


これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています

line += llList2String(dirc_list,dirc_idx%8);


if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。

このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。

お礼



以上 センサー ジョビン風でした。

MasterPoppy Amat さん ありがとう!

タグ :LSL中級

同じカテゴリー(LSL講座)の記事
 【講座】誰でもできるLSL touch (2008-02-26 12:10)
 【講座】誰でもできるLSL Listen (2008-02-23 10:34)
 【講座】誰でもできるLSL timer (2008-02-22 12:00)
 【講座】誰でもできるLSL IF 質問 (2008-02-21 15:03)
 【講座】誰でもできるLSL IF (2008-02-21 12:10)
 【講座】誰でもできるLSL 変な数 (2008-02-20 12:05)
Posted by Jvn Writer at 18:59│Comments(5)LSL講座
この記事へのコメント
おおー、リストをつかったんですネ!

スクリプト・に数学に不慣れな方なら僕の方法、

中・上級者ならジョビンさんの方法で書くのがよさそう。

リストを使うと負荷が大きくなる気がして避けていましたが

これぐらいすっきりした処理なら気にするほどではなさそうですね。
Posted by MasterPoppy AmatMasterPoppy Amat at 2008年03月21日 02:49
つかってみました^^
短く書くのが趣味みたいなところがありますw

ほんとうはもう一点変更ポイントあったんですが、
そいつがうまくいかなかったので削除です^^;

今回の場合は最大8回のif文が
llList2String 1回に置き換えられたので
おそらく負荷は、むしろ軽くなると思いますよ。

おっしゃるとおり初心者の人は
ポピーさんの方法のソースのほうが直感的なのでいいですね!
直感的なのは大事です。はい。
Posted by Jvn WriterJvn Writer at 2008年03月21日 13:06
atan2で求まる太陽の角度は、真東のとき140度です。本来180度であるべきなのに
なので、あちらこちらで見かける45度で割った8方向の手法では、正確な太陽位置は出ません
Posted by hirohiro at 2008年04月29日 04:02
いや、西でした^^;
一度、日が沈む位置を地図情報から確認してみてください
Posted by hirohiro at 2008年04月29日 04:03
そ そうなんですか
ご指摘ありがとうございますー
Posted by Jvn WriterJvn Writer at 2008年07月13日 07:54
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。