2008年07月18日
再(帰)樹を作ってみた
本棚を整理していたら なにかそのようなことが書かれてある雑誌が出てきたので
-----
捨てる前に SL でインプリできないか試してみた
-----
アイデアとしては(インプリを簡単にするため)パスカットして中心を端っこにもっていったプリム を再帰的に生成してやろうと...
-----
軌道エレベータのリベンジもかね...
-----
-----
なんか違う感じがする...
-----
-----
修正する度に 入れ子を入れ直さないといけないので 手間だ~
-----
-----
ぐは...
-----
-----
ん~
-----
-----
できた?
-----
けど 区画のプリム数の制約で 途中で切れてしまったか
-----
-----
大丈夫そうな気はするんだが...
-----
-----
-----
これだといまいち迫力がないな w
-----
と書いていたんだが... やっぱり 一部 間違えていて 朝起きて 修正(ランダムな要素も取り入れた)とりあえずこれでいいかも w
-----
-----
-----
というわけでリストも上げておきます
-----
rez する関数で 1つしかパラメタが渡せないので かえって変な作りになってるけど w
-----
llRot2Left でなくてはいけないというのは ローカル座標にして判断しないとダメだったり llAxes2Rot というのを始めて使ってみたり...
-----
捨てる前に SL でインプリできないか試してみた
-----
アイデアとしては(インプリを簡単にするため)パスカットして中心を端っこにもっていったプリム を再帰的に生成してやろうと...
-----
軌道エレベータのリベンジもかね...
-----
-----
なんか違う感じがする...
-----
-----
修正する度に 入れ子を入れ直さないといけないので 手間だ~
-----
-----
ぐは...
-----
-----
ん~
-----
-----
できた?
-----
けど 区画のプリム数の制約で 途中で切れてしまったか
-----
-----
大丈夫そうな気はするんだが...
-----
-----
-----
これだといまいち迫力がないな w
-----
と書いていたんだが... やっぱり 一部 間違えていて 朝起きて 修正(ランダムな要素も取り入れた)とりあえずこれでいいかも w
-----
-----
-----
というわけでリストも上げておきます
-----
rez する関数で 1つしかパラメタが渡せないので かえって変な作りになってるけど w
//そうそう rotation が難しいと思った(一応 こうかなと思ったわけだけれど)
// 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);
}
}
}
}
-----
llRot2Left でなくてはいけないというのは ローカル座標にして判断しないとダメだったり llAxes2Rot というのを始めて使ってみたり...
Posted by walkinglint at 06:02│Comments(0)
│walking のスクリプティング講座