ソラマメブログ

2008年07月18日

再(帰)樹を作ってみた

本棚を整理していたら なにかそのようなことが書かれてある雑誌が出てきたので
-----
捨てる前に SL でインプリできないか試してみた
-----
アイデアとしては(インプリを簡単にするため)パスカットして中心を端っこにもっていったプリム を再帰的に生成してやろうと...
-----
軌道エレベータのリベンジもかね...
-----

-----
なんか違う感じがする...
-----

-----
修正する度に 入れ子を入れ直さないといけないので 手間だ~
-----

-----
ぐは...
-----

-----
ん~
-----

-----
できた?
-----
けど 区画のプリム数の制約で 途中で切れてしまったか
-----

-----
大丈夫そうな気はするんだが...
-----

-----

-----
これだといまいち迫力がないな w
-----
と書いていたんだが... やっぱり 一部 間違えていて 朝起きて 修正(ランダムな要素も取り入れた)とりあえずこれでいいかも w
-----

-----

-----
というわけでリストも上げておきます
-----
rez する関数で 1つしかパラメタが渡せないので かえって変な作りになってるけど w
//
// File: Tree.lsl
// Date Author number of nodes
// 2008/7/18 walkinglint 55
// 2008/7/17 walkinglint 33
//
integer i;
integer num_of_branch = 3;
vector scale;
float size;
float org_size = 5.0;
float size_factor = 0.7;
integer org_n = 4;
integer n;
float offset;
float randomize(float f) {
return f * 0.8 + llFrand(f * 0.4);
}
gen_branch(integer i, float f) {
vector up = llRot2Up(llGetRot());
vector left = llRot2Left(llGetRot());
rotation rot1;
rotation rot2;
float deg1;
float deg2;
deg1 = randomize(15.0);
rot1 = llAxisAngle2Rot(up, deg1 * DEG_TO_RAD);
deg2 = randomize(360.0/num_of_branch * i + f);
rot2 = llAxisAngle2Rot(left, deg2 * DEG_TO_RAD);
llRezObject("Tree", llGetPos() + left * size, ZERO_VECTOR, llGetRot() * rot1 * rot2, n - 1 + 1);
}
float gen_offset() {
return llFrand(360.0 / num_of_branch);
}
default {
state_entry() {
scale = llGetScale();
size = scale.y / 2;
n = org_n;
}
on_rez(integer param) {
if (param > 0) {
n = param - 1;
float actual_size_factor = 1;
for (i = 0; i < org_n - n; i++) {
actual_size_factor *= size_factor;
}
llSetScale(llGetScale() * actual_size_factor);
scale = llGetScale();
size = scale.y / 2;
if (n > 0) {
offset = gen_offset();
for (i = 0; i < num_of_branch; i++) {
gen_branch(i, offset);
}
}
}
}
touch_start(integer total_number) {
scale = llGetScale();
size = scale.y / 2;
if (n > 0) {
offset = gen_offset();
for (i = 0; i < num_of_branch; i++) {
gen_branch(i, offset);
}
}
}
}
そうそう rotation が難しいと思った(一応 こうかなと思ったわけだけれど)
-----
llRot2Left でなくてはいけないというのは ローカル座標にして判断しないとダメだったり llAxes2Rot というのを始めて使ってみたり...

同じカテゴリー(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)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。