2008年03月14日
【中級】センサースクリプトに挑戦
こんばんは、ジョビンです。
あしあとをたどってみたら MasterPoppy Amat さんという方が
センサースクリプトを公開されていました。
http://masterpoppy.slmame.com/e172204.html
なるほどなるほど。
こうやって方角を検知するんですね。
トラックバック歓迎とのことでしたので、
私もセンサーに挑戦してみました!
はじめましてのご挨拶にトラックバック。
ちなみに、決してどっちのスクリが正解とかそういうことを言いたいわけではありません。
私は、スクリプトを公開することはとてもいいことだと思っています。
スクリプター同士が、お互いの手法を見ながら学びあうのは、さらにすばらしいことだと思っています。
ですから、MasterPoppy さんから学ばせていただいたジョビンが
お返しに公開するエントリーです。
やってるもの同士お互いに刺激が受けられますし、
同じものを違う角度から見るとまた理解が深まるでしょう。
この記事を見られる方々に、そのように受け取っていただければ幸いです。
テストはしていないので、動作は保障しません。
動かした方、結果を教えていただければ幸いです。
実はこの記事は一週間前に公開したんですが
帰宅後インで実験したらひどい結果になったので
あわてて非公開にしたんでした^^;
違いはこの行だけです。
分解して順番に見ていきましょう。
この行は 元のソースのままです。
値は - PI ~ PI になります
こうすると - 0.5 ~ 0.5
になります。
ここまでは大丈夫でしょうか?
これで、 0~8 になりました
これを %8 で0~7にして
リストのインデックスとして使っています
if 文で 1から順番に8回比べるより、
こっちのほうが短くかけます。
このリストの使い方は、たいへん応用が利くし
計算の回数を減らすことのできるテクニックなので、
ぜひ紹介したいとおもいこのエントリーを書きました。
以上 センサー ジョビン風でした。
MasterPoppy Amat さん ありがとう!
あしあとをたどってみたら 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 さん ありがとう!
この記事へのトラックバックURL
http://jvn.slmame.com/t173285
この記事へのコメント
おおー、リストをつかったんですネ!
スクリプト・に数学に不慣れな方なら僕の方法、
中・上級者ならジョビンさんの方法で書くのがよさそう。
リストを使うと負荷が大きくなる気がして避けていましたが
これぐらいすっきりした処理なら気にするほどではなさそうですね。
スクリプト・に数学に不慣れな方なら僕の方法、
中・上級者ならジョビンさんの方法で書くのがよさそう。
リストを使うと負荷が大きくなる気がして避けていましたが
これぐらいすっきりした処理なら気にするほどではなさそうですね。
Posted by MasterPoppy Amat
at 2008年03月21日 02:49
at 2008年03月21日 02:49つかってみました^^
短く書くのが趣味みたいなところがありますw
ほんとうはもう一点変更ポイントあったんですが、
そいつがうまくいかなかったので削除です^^;
今回の場合は最大8回のif文が
llList2String 1回に置き換えられたので
おそらく負荷は、むしろ軽くなると思いますよ。
おっしゃるとおり初心者の人は
ポピーさんの方法のソースのほうが直感的なのでいいですね!
直感的なのは大事です。はい。
短く書くのが趣味みたいなところがありますw
ほんとうはもう一点変更ポイントあったんですが、
そいつがうまくいかなかったので削除です^^;
今回の場合は最大8回のif文が
llList2String 1回に置き換えられたので
おそらく負荷は、むしろ軽くなると思いますよ。
おっしゃるとおり初心者の人は
ポピーさんの方法のソースのほうが直感的なのでいいですね!
直感的なのは大事です。はい。
Posted by Jvn Writer
at 2008年03月21日 13:06
at 2008年03月21日 13:06atan2で求まる太陽の角度は、真東のとき140度です。本来180度であるべきなのに
なので、あちらこちらで見かける45度で割った8方向の手法では、正確な太陽位置は出ません
なので、あちらこちらで見かける45度で割った8方向の手法では、正確な太陽位置は出ません
Posted by hiro
at 2008年04月29日 04:02
at 2008年04月29日 04:02いや、西でした^^;
一度、日が沈む位置を地図情報から確認してみてください
一度、日が沈む位置を地図情報から確認してみてください
Posted by hiro
at 2008年04月29日 04:03
at 2008年04月29日 04:03そ そうなんですか
ご指摘ありがとうございますー
ご指摘ありがとうございますー
Posted by Jvn Writer
at 2008年07月13日 07:54
at 2008年07月13日 07:54