ソラマメブログ

  
Posted by at

2008年06月30日

プロッタ(その3) - llParseString2List

ノートカードから読み込ませるようにしてみました...
-----

-----
ついでに 変動がなかった場合の処理 が正しくなされているか確認しました w
-----
プロッタ本体側だけの変更でこんな感じ
//
// File: plotter2.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 61
// 2008/6/30 walkinglint 61 (plotter->plotter2)
// 2008/6/30 walkinglint 61
//
integer num_of_dots = 20;
integer min_link_num = 2;
float size = 0.5;
list init_x;
list init_y;
list x;
list y;
integer i;
string notecard_name = "data";
list data_xy;
integer read_line;
key query_id;
set_init() {
init_x = [];
init_y = [];
for (i = 0; i < num_of_dots; i++) {
init_x += (float)i;
init_y += (float)i;
}
}
activate_load_and_draw() {
x = [];
y = [];
llOwnerSay("Now Loading..");
read_line = 0;
if (llGetInventoryType(notecard_name) == INVENTORY_NOTECARD) {
query_id = llGetNotecardLine(notecard_name, read_line); // request first line
} else {
llOwnerSay("Notecard " + notecard_name + " is not found");
}
}
draw(list data_x, list data_y) {
float unit = size / (num_of_dots + 1);
float range = size - unit * 2;
vector pos_org = <-(size / 2.0) + unit, -(size / 2.0) + unit, 0>;
float min_x = llListStatistics(LIST_STAT_MIN, data_x);
float max_x = llListStatistics(LIST_STAT_MAX, data_x);
float min_y = llListStatistics(LIST_STAT_MIN, data_y);
float max_y = llListStatistics(LIST_STAT_MAX, data_y);
float scale_x;
integer flat_x = (max_x == min_x);
if (!flat_x) {
scale_x = range / (max_x - min_x);
}
float scale_y;
integer flat_y = (max_y == min_y);
if (!flat_y) {
scale_y = range / (max_y - min_y);
}
vector pos = ZERO_VECTOR;
for (i = 0; i < num_of_dots; i++) {
float x = llList2Float(data_x, i);
float y = llList2Float(data_y, i);
if (!flat_x) {
pos.y = pos_org.x + (x - min_x) * scale_x;
}
if (!flat_y) {
pos.z = pos_org.y + (y - min_y) * scale_y;
}
llMessageLinked(min_link_num + i, 0, (string)pos, NULL_KEY);
}
}
default {
state_entry() {
set_init();
draw(init_x, init_y);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
activate_load_and_draw();
}
dataserver(key queryid, string data) {
if (queryid == query_id) {
if (data != EOF) {
// process data
if (llStringLength(data) != 0) {
data_xy = llParseString2List(data, [","], []);
x += llList2Float(data_xy, 0);
y += llList2Float(data_xy, 1);
}
read_line++;
query_id = llGetNotecardLine(notecard_name, read_line);
} else {
llOwnerSay("Loading complete.");
draw(x, y);
}
}
}
}
ノートカードの読み込みはこれまでも何回もやっているので特に新しいことはありません ^^
-----
使ったデータは
1,5
2,5
3,5
4,5
5,5
6,5
7,5
8,5
9,5
10,5
11,5
12,5
13,5
14,5
15,5
16,5
17,5
18,5
19,5
20,5
  

2008年06月30日

プロッタ(その2) - llListStatistics

プロッタですが とりあえず sin 関数を表示することができる所まで来ました
-----
後は 弾道データを取り ノートからそれを読み込ませるようにすることぐらいかな w
-----

-----
初期状態で こんな感じに... sin 関数を表示すると 10個ではいまいちだったので ドットの個数は 20個に増やしました
-----

-----
sin 関数を表示するとこんな感じ
-----
リストもあげておきます
-----
プロッタ本体はこんな感じ(結構増えたな w)
//
// File: plotter.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 60
//
integer num_of_dots = 10;
integer min_link_num = 2;
float size = 0.5;
list init_x;
list init_y;
list x;
list y;
integer i;
set_init() {
init_x = [];
init_y = [];
for (i = 0; i < num_of_dots; i++) {
init_x += (float)i;
init_y += (float)i;
}
}
set_sin() {
x = [];
y = [];
for (i = 0; i < num_of_dots; i++) {
x += (float)((TWO_PI / num_of_dots) * i);
y += (float)llSin((float)((TWO_PI / num_of_dots) * i));
}
}
draw(list data_x, list data_y) {
float unit = size / (num_of_dots + 1);
float range = size - unit * 2;
vector pos_org = <-(size / 2.0) + unit, -(size / 2.0) + unit, 0>;
float min_x = llListStatistics(LIST_STAT_MIN, data_x);
float max_x = llListStatistics(LIST_STAT_MAX, data_x);
float min_y = llListStatistics(LIST_STAT_MIN, data_y);
float max_y = llListStatistics(LIST_STAT_MAX, data_y);
float scale_x;
integer flat_x = (max_x == min_x);
if (!flat_x) {
scale_x = range / (max_x - min_x);
}
float scale_y;
integer flat_y = (max_y == min_y);
if (!flat_y) {
scale_y = range / (max_y - min_y);
}
vector pos = ZERO_VECTOR;
for (i = 0; i < num_of_dots; i++) {
float x = llList2Float(data_x, i);
float y = llList2Float(data_y, i);
if (!flat_x) {
pos.y = pos_org.x + (x - min_x) * scale_x;
}
if (!flat_y) {
pos.z = pos_org.y + (y - min_y) * scale_y;
}
llMessageLinked(min_link_num + i, 0, (string)pos, NULL_KEY);
}
}
default {
state_entry() {
set_init();
draw(init_x, init_y);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
set_sin();
draw(x, y);
}
}
タイトルの llListStatistics は最大値と最小値を求めるのに使っています
-----
pos.y と pos.z に設定しているのは こうしないと 面と垂直方向にプロットされてしまったからなのですが
-----
試行錯誤してしまいました ^^;
-----
ローカルな座標の向きがいまいち分かりません w
-----
ドットの部分はこんな感じ
//
// File: dot.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 17
//
default {
on_rez(integer param) {
llResetScript();
}
link_message(integer sender_num, integer num, string str, key id) {
llSetPos((vector)str);
}
}
早速 vector の明示的なキャストを用いています w  

2008年06月30日

プロッタ - llGetLocalPos/llSetPos

AV Radar できたので 次 プロッタ作ろうと ひとまず形だけ作ってみました
-----

-----
まあこんな所かというわけで 簡単なスクリプトで実現方法の確認(フィージビリティテスト)w
-----

-----
リンクされているものの位置を変更するというのはまだやったことがなかったので 試してみたが まあ うまくいっているようです
-----
というわけで ここまでのスクリプトもあげておきます
-----
プロッタ本体はこんな感じ
//
// File: plotter.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 12
//
default {
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
llMessageLinked(2, 0, "", NULL_KEY);
}
}
ドットの部分はこんな感じ
//
// File: dot.lsl
// Date Author number of nodes
// 2008/6/30 walkinglint 17
//
vector pos;
default {
on_rez(integer param) {
llResetScript();
}
link_message(integer sender_num, integer num, string str, key id) {
pos = llGetLocalPos();
llOwnerSay((string)pos);
pos.z = 0;
llOwnerSay((string)pos);
llSetPos(pos);
}
}
最初 llGetPos すれば それが 子供の場合 ローカルな座標が取られるのかなと思っていたら
-----
そうではなくて グローバルな座標が取れれていて驚いた ^^
-----
なのに llSetPos だと ローカルな座標で設定するのだ... この対称性の無さ w
-----
後はどうしようかな 三角関数とかプロットしてみようか ノートからデータを入れて表示させるのがいいかな... とりあえず 時間と落下距離との関係をプロットするのが目的で作り始めたわけなので それはするつもりだけど w  

2008年06月30日

AV レーダーできた

作るかな~ と言っていたものを作ってみました
-----

-----

-----

-----
リストもあげておきます
-----
まず本体の側
//
// File: AVRadar.lsl
// Date Author number of nodes
// 2008/6/29 walkinglint 21
//
integer i;
float range = 2.5;
float scale;
vector radar_pos;
vector av_image_pos;
integer av_image_channel = 851;
default {
state_entry() {
llSensorRepeat("", NULL_KEY, AGENT, 96.0, PI, 60);
scale = 2.5 / (2.0 * 96.0);
}
on_rez(integer param) {
llResetScript();
}
sensor(integer num_detected) {
radar_pos = llGetPos();
for (i = 0; i < num_detected; i++) {
av_image_pos = radar_pos + (llDetectedPos(i) - radar_pos) * scale;
llRezObject("av_image", av_image_pos, ZERO_VECTOR, ZERO_ROTATION, 0);
llSleep(0.1);
llSay(av_image_channel, llDetectedName(i) + "," + (string)llDetectedKey(i));
}
}
}
次に AV 毎に生成するボールの側
//
// File: av_image.lsl
// Date Author number of nodes
// 2008/6/29 walkinglint 39
//
integer listener;
integer av_image_channel = 851;
list av_data;
string av_name;
key av_key;
integer av_dist;
integer av_info;
default {
state_entry() {
listener = llListen(av_image_channel, "", "", "");
}
on_rez(integer param) {
llResetScript();
}
listen(integer channel, string name, key id, string message) {
av_data = llParseString2List(message, [","], []);
av_name = llList2String(av_data, 0);
av_key = llList2Key(av_data, 1);
av_dist = llList2Integer(av_data, 2);
llSetText(av_name, <1.0, 1.0, 1.0>, 1.0);
if (av_dist >= 20) {
llSetAlpha(0.5, ALL_SIDES);
} else {
llSetAlpha(1.0, ALL_SIDES);
}
av_info = llGetAgentInfo(av_key);
if (av_info & AGENT_TYPING) {
llSetPrimitiveParams([25, ALL_SIDES, 0.1]);
} else {
llSetPrimitiveParams([25, ALL_SIDES, 0.0]);
}
if ((av_info & AGENT_FLYING) || (av_info & AGENT_IN_AIR)) {
llSetColor(<1.0, 0.0, 0.0>, ALL_SIDES);
} else if (av_info & AGENT_WALKING) {
llSetColor(<1.0, 1.0, 0.0>, ALL_SIDES);
} else if ((av_info & AGENT_ON_OBJECT) || (av_info & AGENT_SITTING)) {
llSetColor(<0.0, 0.0, 1.0>, ALL_SIDES);
} else {
llSetColor(<0.0, 1.0, 0.0>, ALL_SIDES);
}
llListenRemove(listener);
}
}
  

2008年06月30日

メモリ管理(その2)

昨日 Arare Cafe に行くと Arare さんが
-----
そだ、Walkingさん、 llGetFreeMemory ですけど、
呼ばれた時点での空きメモリを返すしようじゃないみたいです。
それまでの、最小空きメモリを返すみたいですよ。
-----
と...
-----
ん~ そうだとすると ロボット店員のスクリプトはまずい ということになってしまいます
-----
そこで 簡単なスクリプトで試してみることにしました
-----

-----
これはいけません 削除したのに かえってメモリが減ってしまっています ^^;
-----
というわけで
-----

-----
こうしました... メモリが足りなくなったら リセットします
-----
漢(おとこ)な解決方法です w  

2008年06月30日

幻の魚大量発生

噂によると 水曜に 5匹釣った人もいるとか
-----
昨日 daiya さんは 2匹釣った
-----
情報を聞きつけ さっそく purin とでかけました
-----
私は釣れなかったけど purin と 近くにいた Kaguya さんが 同時に釣り上げるという快挙 ^^
-----

  

Posted by walkinglint at 05:04Comments(0)釣り

2008年06月29日

作る/試す もののアイデア

物理な物ってどうなってるんだろうと思う
-----
重力乗数とかあるのか? とか
-----
重いものが先に落ちるなんてことはないんだろうなあ とか
-----
重さってどういう風に影響するんだろう とか
-----
どうやって調べればいいだろうと思ったんだが
-----
毎秒の位置を記録しとりあえずグラフとか書いてみるといいと思ったが
-----
今の PC は SL 専用で Excel のようなものは入れてないから
-----
プロッタのようなものを作る必要があるか
-----
点を生成しリンクするとリンクできないような SIM もあったから 点はあらかじめ作っておいて位置を動かすようにするか とか
-----
3次元のプロッタも作れるかな とか
-----
それができたら AV レーダーなんてのはそれの応用でできてしまうか
-----
とか
-----
物理なものも大きく作ればそれなりに動いているように見えるのでダルマ落としとかできるのかな
-----
物理なドラム缶を積み上げて崩す とか
-----
毎秒の位置を記録するというのも リージョンの Say でチャネルを記録するプロトコルで state 使ってみようか
-----
とか ぼんやり思っているんだが どうしたものか w
-----
宇宙の円筒を AV レーダーに使い 球で AV の位置 名前はホバリングなテキストで レンジは 90m でチャット距離は一度 別アカで確認し チャット距離にないものは透明度を上げ 話しているものを光らせ 飛行 赤 歩行 黄色 立っている 緑 坐っている 青 とかで色分けし 臨時オブジェクトにし とりあえず 1分でリフレッシュ(実用というよりはモニュメント) 中心位置はそれ自身の位置
-----
という仕様が思い浮かんでしまったので 後はこれ作るしかないかなあ と 作る前から 100L$ かなとか思っていたり w  

Posted by walkinglint at 22:03Comments(0)アイデアメモ

2008年06月29日

ぞろ目

街角美人な方の30万アクセスには遠く及びませんが
-----
うっかり見逃す所でしたが 先の記事で こういう
-----

-----
ことになりました w  

Posted by walkinglint at 20:03Comments(2)ブログ