水晶樹

walkinglint

2008年07月21日 10:02


作ってみるかなと言っていたが 作ってみた
-----

-----

-----

-----

-----

-----
夜はいいんだが 昼だと少し光りすぎ... 太陽の位置で輝度を調整するのが良いかも w
-----
というわけで リストもあげておきます...
-----
再樹では中心でパスカットしたんだが これはそのまま生成するようにしたので そのための変更ぐらい
-----
生成時に z軸が上を向いているので 普通に(ローカルな)up 方向に動かすだけでよかった w
//
// File: CrystalTree.lsl
// Date Author number of nodes
// 2008/7/20 walkinglint 53
// 2008/7/20 walkinglint 55 (RecursiveTree->CrystalTree)
// 2008/7/18 walkinglint 55
//
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());
float deg1 = randomize(15.0);
rotation rot1 = llAxisAngle2Rot(left, deg1 * DEG_TO_RAD);
float deg2 = randomize(360.0/num_of_branch * i + f);
rotation rot2 = llAxisAngle2Rot(up, deg2 * DEG_TO_RAD);
rotation rot3 = llGetRot() * rot1 * rot2;
vector up2 = llRot2Up(rot3) * size * size_factor / 2;
llRezObject("CrystalTree", llGetPos() + up * size + up2,
ZERO_VECTOR, rot3, 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.z / 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.z / 2;
if (n > 0) {
offset = gen_offset();
for (i = 0; i < num_of_branch; i++) {
gen_branch(i, offset);
}
}
}
}
walking のスクリプティング講座