2008年07月21日
Crystals
水晶を生やす方もやってみた
-----
Randrian の方法(RGB 輝度 透明度 ランダム設定)で色設定してみると いまいちしっくりしないので やはり(この所 そればっかりの)HSVtoRGB を使うことにした w
-----
-----
-----
-----
-----
地面の高低差を考慮して生えているのは キノコ と同じ... ただ これだと(多分)本当の地面にしか設置できないのが欠点かも w
-----
スクリプトもあげておきます
-----
まず 本体側から
-----
水晶側
-----
llSetRot で 5度のレンジでランダムにしてみた... もう少し傾けてもいいかも w
-----
Randrian の方法(RGB 輝度 透明度 ランダム設定)で色設定してみると いまいちしっくりしないので やはり(この所 そればっかりの)HSVtoRGB を使うことにした w
-----
-----
-----
-----
-----
地面の高低差を考慮して生えているのは キノコ と同じ... ただ これだと(多分)本当の地面にしか設置できないのが欠点かも w
-----
スクリプトもあげておきます
-----
まず 本体側から
//こっちは変更なかったか w
// File: crystals.lsl
// Date Author number of nodes
// 2008/7/20 walkinglint 17
// 2008/7/20 walkinglint 17 (mushrian->crystals)
// 2008/6/20 walkinglint 17
//
float range = 3.0;
float time_interval = 5.0;
gen_crystal() {
llRezObject("crystal", llGetPos() + (<(llFrand(1.0) - 0.5) * range, (llFrand(1.0) - 0.5) * range, 0.0>) * llGetRot(),
ZERO_VECTOR, llGetRot(), 0);
}
default {
state_entry() {
llSetTimerEvent(0.0);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
llOwnerSay("started");
gen_crystal();
llSetTimerEvent(time_interval);
}
timer() {
gen_crystal();
}
}
-----
水晶側
//真っ直ぐ立っていると感じが出ないので
// File: crystal.lsl
// Date Author number of nodes
// 2008/7/20 walkinglint 100
// 2008/7/20 walkinglint 26 (1upmushroom->crystal)
// 2008/6/21 walkinglint 26
// 2008/6/20 walkinglint 24
//
vector HSVtoRGB(vector hsv) {
integer i;
float H = hsv.x;
if (H < 0) { // catch malformed H input
H = 0;
} else if (H > 360) {
H = 360;
}
float S = hsv.y;
if (S < 0) { // catch malformed S input
S = 0;
} else if (S > 1) {
S = 1;
}
float V = hsv.z;
if (V < 0) { // catch malformed V input
V = 0;
} else if (V > 1) {
V = 1;
}
float R;
float G;
float B;
float f; // variables for calculating base color mixing around the "spectrum circle"
float p;
float q;
float t;
vector rgb;
if (S == 0) { // achromatic (grey) simply set R,G, & B = Value
R = V;
G = V;
B = V;
rgb.x = R;
rgb.y = G;
rgb.z = B;
return rgb;
}
H /= 60; // Hue factored into range 0 to 5
i = llFloor(H); // integer floor of Hue
f = H - i; // factorial part of H
p = V * (1 - S);
q = V * (1 - S * f);
t = V * (1 - S * ( 1 - f ));
if (i == 0) {
R = V;
G = t;
B = p;
} else if (i == 1) {
R = q;
G = V;
B = p;
} else if (i == 2) {
R = p;
G = V;
B = t;
} else if (i == 3) {
R = p;
G = q;
B = V;
} else if (i == 4) {
R = t;
G = p;
B = V;
} else {
R = V;
G = p;
B = q;
}
rgb.x = R;
rgb.y = G;
rgb.z = B;
return rgb;
}
integer steps = 5;
integer tick = 1;
vector final_size = <0.1, 0.1, 0.5>;
vector pos;
set_color() {
vector color = HSVtoRGB();
llSetColor(color, ALL_SIDES);
llSetAlpha(llFrand(1.0), ALL_SIDES);
llSetPrimitiveParams([25, ALL_SIDES, 0.1]);
}
set_scale() {
tick++;
vector scale = final_size / steps * tick;
llSetScale(scale);
llSetPos();
}
default {
state_entry() {
llSetTimerEvent(60.0 / steps);
pos = llGetPos();
set_color();
set_scale();
llSetRot(llGetRot() * llEuler2Rot(llFrand(10.0) - 5.0> * DEG_TO_RAD));
}
on_rez(integer param) {
llResetScript();
}
timer() {
set_scale();
if (tick > steps) {
llSetTimerEvent(0);
}
}
}
-----
llSetRot で 5度のレンジでランダムにしてみた... もう少し傾けてもいいかも w
Posted by walkinglint at 12:38│Comments(0)
│walking のスクリプティング講座