ソラマメブログ

2008年11月10日

くらげ の作り方 - 逐次解説

//
// File: jerryfish.lsl
// Date Author number of nodes
// 2008/11/6 walkinglint 35
//
-----
いつ作ったかをコメント
-----
自作のツールを使い 自動的に入れています w
-----
vector init_pos;
-----
rez した時の位置(SIM 座標)を入れる変数
-----
vector というのは 3つの数字からなるデータ型
-----
vector pos;
-----
今の位置を入れる変数
-----
vector dist = <0.0, 0.0, 2.0>;
-----
移動距離を示す変数(実際には定数として使用)
-----
z 軸方向に 2m 動かすことを示している
-----
vector init_size = <1.0, 1.0, 1.0>;
-----
標準状態でのサイズを示す変数(定数として使用)
-----
list deform_list = [<1.0, 1.0, 1.0>, <1.5, 1.5, 0.75>, <0.75, 0.75, 1.5>];
-----
サイズをどのように変更するかを示すリスト
-----
リストの要素は ここでは vector
-----
integer deform_no;
-----
上記リストの何番目 かを示す変数
-----
vector sz;
-----
今のサイズを示す変数
-----
float delay = 1.0;
-----
(サイズの)変更間の時間間隔
-----
integer repetition = 5;
-----
何回繰り返したら初期位置に戻すか
-----
integer seq_no;
-----
サイズ変更した回数を保持する変数
-----
integer max_seq_no;
-----
サイズ変更の回数の最大値を保持する変数
-----
vector deform(vector a, vector b) {
return <a.x * b.x, a.y * b.y, a.z * b.z>;
}
-----
deform という(vector の変数を 2つとり vector を返す)関数の定義
-----
vector に含まれる 3つの数同士を掛け合わせて返す
-----
default {
state_entry() {
-----
rez されると最初に default の state_entry が実行される
-----
init_pos = llGetPos();
-----
今の位置を init_pos に入れる
-----
pos = init_pos;
-----
その値を 今の位置を示す pos に入れる
-----
seq_no = 0;
-----
サイズ変更の回数を 0 に初期化
-----
max_seq_no = llGetListLength(deform_list) * repetition;
-----
サイズ変更の回数の最大値を計算
-----
llGetListLength はリストの大きさを返す
-----
3 としても同じなんだけれど 将来の変更を意識
-----
llSetTimerEvent(delay);
-----
delay 時間毎に timer(下記参照)を起動するよう設定
-----
}
timer() {
-----
llSetTimerEvent で設定された時間毎に以下を実行
-----
deform_no = seq_no % 3;
-----
何回目のサイズ変更かを 3で割った余りで
-----
サイズ変更のパターンの番号を設定する
-----
3 は llGetListLength を使った方が整合的 w
-----
sz = deform(init_size, llList2Vector(deform_list, deform_no));
-----
llList2Vector は vector を要素とするリストから
-----
vector を取り出す関数
-----
deform_list から deform_no 番目の vector を取り出す
-----
最初のサイズの vector と 取り出された vector の
-----
それぞれの数字を掛け合わせることで次のサイズを決める
-----
if (deform_no == 2) {
-----
サイズ変更のパターンの番号が 2の時
-----
pos += dist;
-----
次の位置を今の位置に移動距離を足すことで求める
-----
+= というのは 左側の変数に右側の変数の値を足し込む
-----
変数が vector の場合 それぞれの値に足し込まれる
-----
}
llSetPrimitiveParams([PRIM_POSITION, pos, PRIM_SIZE, sz]);
-----
このスクリプトの入っているプリムのパラメタを変更する関数
-----
変更するパラメタと 値のペアをリストの形で与える
-----
位置を pos に サイズを sz に変更する
-----
seq_no++;
-----
サイズ変更の回数をカウント
-----
++ は 変数の値を 1増やす
-----
if (seq_no > max_seq_no) {
-----
サイズ変更の回数が最大値を超えた場合 以下を実行
-----
pos = init_pos;
-----
次の位置を初期位置に
-----
llSetPrimitiveParams([PRIM_SIZE, <0.01, 0.01, 0.01>]);
-----
サイズを 1cm 四方に
-----
seq_no = 0;
-----
サイズの変更回数を初期化
-----
}
}
on_rez(integer param) {
-----
rez 実行時に以下を実行
-----
llResetScript();
-----
このスクリプトの実行をリセット
-----
装着するスクリプトの場合意味があるが
-----
くらげの場合 意味無かったかも w
-----
}
}

同じカテゴリー(walking のスクリプティング講座)の記事
 プロフィール写真の表示に問題 (2009-11-30 20:55)
 ミニ太陽系 (2009-03-21 06:03)
 関数から文字列を返したら何か問題になる? (2009-03-18 18:02)
 llListFindList って型って関係ないんだったっけ (2009-03-18 14:02)
 夏時間(PDT)の実験 (2009-03-08 22:04)
 15パズルの作り方(その3) (2009-03-08 06:03)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。