ソラマメブログ

2008年06月26日

Color Cycle(その2) - RGBtoHSV

Color conversion scripts - Second Life Wiki
-----
の RGBtoHSV を試してみました
-----

-----
結果は H の部分が 0 から 多分 360 まで変化してるようだ
-----
というわけで全部のリストもあげておきます
//
// File: RGBtoHSV.lsl
// Date Author number of nodes
// 2008/6/26 walkinglint 82
//
//
// by [[Sally LaSalle]], code released to the public domain under GNU GPL version 3.0 license.
// you are free to use, and you are free to donate to me if you wish!! :P
// takes an RGB color as a vector, with range
// returns a vector with HSV ranged from
// H ranges smoothly from Red=0, Yellow=60, Green=120,
// Cyan=180, Blue=240, Violet=300 and back to Red
//
// http://wiki.secondlife.com/wiki/Color_conversion_scripts
vector RGBtoHSV(vector rgb) {
float R = rgb.x;
if (R < 0) { // catch malformed input
R = 0;
} else if (R > 1) {
R = 1;
}
float G = rgb.y;
if (G < 0) { // catch malformed input
G = 0;
} else if (G > 1) {
G = 1;
}
float B = rgb.z;
if (B < 0) { // catch malformed input
B = 0;
} else if (B > 1) {
B = 1;
}
float H;
float S;
float V;
list rgbList = [R, G, B]; // list used to get min and max
float min;
float max;
float achromatic; // =1 if R=G=B
float delta;
vector hsv; // the return HSV vector
min = llListStatistics(LIST_STAT_MIN, rgbList);
// MIN of ( R, G, B );
max = llListStatistics(LIST_STAT_MAX, rgbList);
// MAX of (R, G, B);
if (R == G && G == B) {
achromatic = 1; // it is a shade of grey, white or black
} else {
achromatic = 0;
}
V = max; // V = brightness Value form 0 to 1
delta = max - min;
if (max != 0) {
S = delta / max; // S = saturation from 0 to 1
} else {
// R = G = B = 0 // S = 0, V = 0, H = 0
S = 0;
V = 0;
H = 0;
hsv.x = H;
hsv.y = S;
hsv.z = V;
return hsv; // H = S = V = 0
}
if (achromatic == 1) {
H = 0;
} else if (R == max) {
H = 0 + ( G - B ) / delta; // between red & yellow
} else if (G == max) {
H = 2 + ( B - R ) / delta; // between yellow & cyan
} else {
H = 4 + ( R - G ) / delta; // between cyan & red
}
H *= 60; // H is traditionally a figure between 0 and 360 degrees
if (H < 0) {
H += 360;
}
hsv.x = H;
hsv.y = S;
hsv.z = V;
return hsv;
}
list realcolors = [
<1.000000, 0.000000, 0.000000>, <1.000000, 0.200000, 0.000000>,
<1.000000, 0.400000, 0.000000>, <1.000000, 0.501961, 0.000000>,
<1.000000, 0.600000, 0.000000>, <1.000000, 0.698039, 0.000000>,
<1.000000, 0.800000, 0.000000>, <1.000000, 0.898039, 0.000000>,
<1.000000, 1.000000, 0.000000>, <0.800000, 1.000000, 0.000000>,
<0.200000, 1.000000, 0.000000>, <0.000000, 0.800000, 0.000000>,
<0.000000, 0.698039, 0.400000>, <0.000000, 0.600000, 0.600000>,
<0.000000, 0.400000, 0.698039>, <0.000000, 0.200000, 0.800000>,
<0.098039, 0.098039, 0.698039>, <0.200000, 0.000000, 0.600000>,
<0.250980, 0.000000, 0.600000>, <0.400000, 0.000000, 0.600000>,
<0.600000, 0.000000, 0.600000>, <0.800000, 0.000000, 0.600000>,
<0.898039, 0.000000, 0.400000>];
// keep time
integer g_TIMER = 0;
// the offset into the color array
integer g_NDX = 0;
default {
touch_start(integer total_number) {
// turn the timer on/off
g_TIMER = !g_TIMER;
// cheeky use of flag as timer value
llSetTimerEvent(g_TIMER);
}
timer() {
if (g_NDX > llGetListLength(realcolors) - 1) {
g_NDX = 0;
}
vector rgb = llList2Vector(realcolors, g_NDX);
llSetColor(rgb, ALL_SIDES);
llOwnerSay((string)RGBtoHSV(rgb));
g_NDX++;
}
}
次は HSVtoRGB を使い もう少し滑らかに色を変えれないか試してみよう... 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)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。