2008年11月17日
蝶の作り方 - 逐次解説(その4)
sensor(integer total_number) {-----
sensor_any();
-----
境界の処理
-----
// Populate neighbors with the positions of the two nearest neighbors.
vector mypos = llGetPos();
-----
位置を mypos に入れる
-----
list neighbors = [];
-----
最も近くの 2つものの位置を入れるリスト
-----
integer i;
for (i = 0; i < total_number; i++) {
-----
スキャンで検出されたものを調べる
-----
vector current_pos = llDetectedPos(i);
-----
検出されたものの位置を current_pos に入れる
-----
if (llGetListLength(neighbors) < 2) {
// Add to list
neighbors = llListInsertList(neighbors, [current_pos], llGetListLength(neighbors));
-----
2つに満たない場合 その位置を neighbors に入れる
-----
} else {
//
// Check to see if the current vector is closer than the list
// vector which is furthest away.
//
if (llVecDist(mypos, llList2Vector(neighbors, 0)) >
llVecDist(mypos, llList2Vector(neighbors, 1))) {
// check against first list item
if (llVecDist(mypos, llList2Vector(neighbors, 0)) > llVecDist(mypos, current_pos)) {
llListInsertList(neighbors, [current_pos], 0);
}
} else {
// check against second list item
if (llVecDist(mypos, llList2Vector(neighbors, 1)) > llVecDist(mypos, current_pos)) {
llListInsertList(neighbors, [current_pos], 1);
}
}
-----
うーん これだとでも 最も近いもの 2つということにはないっていないんだけど...
-----
細かいことはいいのかな w
-----
}
}
//
// Process movement
// Apply force
//
if (llGetListLength(neighbors) == 2) {
-----
2つ見つかった場合
-----
vector neighbor1 = llList2Vector(neighbors, 0);
vector neighbor2 = llList2Vector(neighbors, 1);
vector target = neighbor2 + ((neighbor1 - neighbor2) * 0.5);
vector impulse = <0, 0, 0>;
if (school) {
impulse = llVecNorm(target + school_modifier - mypos);
} else {
impulse = llVecNorm(target - mypos);
}
// llSay(0, "setforce " + (string)(impulse * force_modifier * mass));
llSetForce(impulse * force_modifier * mass, FALSE);
-----
群れ動作? の場合 school_modifier をプラスするが
-----
それ以外の場合 近くの 2つの間に向かうよう力を加える
-----
これだとでも 固まってしまうような気がするな~ 実際 そうなんだけど w
-----
}
// Update rotation
do_rotation(llGetPos(), llGetVel());
-----
速度方向を向く
-----
}
listen(integer channel, string name, key id, string message) {
list myList = llCSV2List(llGetSubString(message, 1, llStringLength(message) - 2));
-----
誰かの言った速度をばらし myList に入れる
-----
if (llGetListLength(myList) == 3) {
school_modifier = <llList2Float(myList, 0), llList2Float(myList, 1), llList2Float(myList, 2)>;
-----
それを改めて school_modifier としている
-----
school_timer = llGetTime();
-----
群れ動作の次の変更時を設定
-----
つまり たまたま あるタイミングで 20m 以内にいる どれかの速度に 揃って動くんだね...
-----
動き的には 少し不自然な感じがするのは そのせいか w
-----
あ llSay の代わりに llWhisper 使うようにしたらいいかも... ふむ~
-----
}
}
on_rez(integer start_param) {
llResetScript();
-----
rez 時にリセット
-----
//
// spawn_location = llGetPos();
// llResetTime();
//
}
}
なるほど そんなことしてたのね という感じかも w
Posted by walkinglint at 20:02│Comments(0)
│walking のスクリプティング講座