2008年07月05日
プロッタ(その4) - 3次元プロッタ
3次元に曲線を描いてみたいと思っていて
-----
臨時オブジェクトでドットを生成とか いろいろ思ってたんだが 単純に前に作ったプロッタを 3次元化してみた
-----
-----
-----
曲線によっては点数増やした方がいいかも...
-----
というわけでリストも
-----
臨時オブジェクトでドットを生成とか いろいろ思ってたんだが 単純に前に作ったプロッタを 3次元化してみた
-----
-----
-----
曲線によっては点数増やした方がいいかも...
-----
というわけでリストも
//
// File: 3d_plotter.lsl
// Date Author number of nodes
// 2008/7/5 walkinglint 76
// 2008/7/5 walkinglint 58 (plotter->3d_plotter)
// 2008/7/4 walkinglint 58
// 2008/6/30 walkinglint 61
//
integer num_of_dots = 20;
integer min_link_num = 2;
float size;
list init_x;
list init_y;
list init_z;
list x;
list y;
list z;
integer i;
set_init() {
init_x = [];
init_y = [];
init_z = [];
for (i = 0; i < num_of_dots; i++) {
init_x += (float)i;
init_y += (float)i;
init_z += (float)i;
}
}
set_sin() {
x = [];
y = [];
z = [];
for (i = 0; i < num_of_dots; i++) {
x += (float)((TWO_PI / num_of_dots) * i);
y += (float)llSin((float)((TWO_PI / num_of_dots) * i));
z += (float)((TWO_PI / num_of_dots) * i);
}
}
draw(list data_x, list data_y, list data_z) {
float unit = size / (num_of_dots + 1);
float range = size - unit * 2;
vector pos_org = <-(size / 2.0) + unit, -(size / 2.0) + unit, -(size / 2.0) + unit>;
float min_x = llListStatistics(LIST_STAT_MIN, data_x);
float max_x = llListStatistics(LIST_STAT_MAX, data_x);
float min_y = llListStatistics(LIST_STAT_MIN, data_y);
float max_y = llListStatistics(LIST_STAT_MAX, data_y);
float min_z = llListStatistics(LIST_STAT_MIN, data_z);
float max_z = llListStatistics(LIST_STAT_MAX, data_z);
float scale_x;
integer flat_x = (max_x == min_x);
if (!flat_x) {
scale_x = range / (max_x - min_x);
}
float scale_y;
integer flat_y = (max_y == min_y);
if (!flat_y) {
scale_y = range / (max_y - min_y);
}
float scale_z;
integer flat_z = (max_z == min_z);
if (!flat_z) {
scale_z = range / (max_z - min_z);
}
vector pos = ZERO_VECTOR;
for (i = 0; i < num_of_dots; i++) {
float x = llList2Float(data_x, i);
float y = llList2Float(data_y, i);
float z = llList2Float(data_z, i);
if (!flat_x) {
pos.y = pos_org.x + (x - min_x) * scale_x;
}
if (!flat_y) {
pos.z = pos_org.y + (y - min_y) * scale_y;
}
if (!flat_z) {
pos.x = pos_org.z + (z - min_z) * scale_z;
}
llMessageLinked(min_link_num + i, 0, (string)pos, NULL_KEY);
}
}
default {
state_entry() {
vector scale = llGetScale();
size = scale.x;
set_init();
draw(init_x, init_y, init_z);
}
on_rez(integer param) {
llResetScript();
}
touch_start(integer total_number) {
set_sin();
draw(x, y, z);
}
}
Posted by walkinglint at 10:03│Comments(0)
│walking のスクリプティング講座