まずは、直方体 (cuboid) の面 (surface) を作るためのスクリプトです。簡単のため、各辺の長さは、1行目に vector として記述してあります。この prim を llRezObject() で rez すると、最後のパラメータが on_rez() イベントのパラメータとして渡ってくるので、これで、どの面を作成するのかを決定しま
vector size = <3.0, 4.0, 5.0>; setSize(integer param) { vector v = size; if (param == 1) { v.x = 0.01; } else if (param == 2) { v.y = 0.01; } else if (param == 3) { v.z = 0.01; } else { return; } llSetScale(v); } default { state_entry() { } on_rez(integer param) { if (param > 0) { setSize(param); } } } |
次に、これを利用して、cuboid の 6つの面を作成して、link するスクリプトです。中心になる prim にこのスクリプトと、上記のスクリプトを含む prim "rectangle surface" を入れて、touch すると、6つの面を作成して、link して、自分自身(中心の prim)は、可能な限り小さくなって、見えなくなります。
vector size = <3.0, 4.0, 5.0>; key owner; rezRectangle(vector pos, integer param) { llRezAtRoot("rectangle surface", pos, <0.0, 0.0, 0.0>, ZERO_ROTATION, param); } rezRectangles() { vector pos = llGetPos(); rezRectangle(pos + < size.x/2, 0.0, 0.0>, 1); rezRectangle(pos + <-size.x/2, 0.0, 0.0>, 1); rezRectangle(pos + < 0.0, size.y/2, 0.0>, 2); rezRectangle(pos + < 0.0,-size.y/2, 0.0>, 2); rezRectangle(pos + < 0.0, 0.0, size.z/2>, 3); rezRectangle(pos + < 0.0, 0.0,-size.z/2>, 3); } setInvisible() { llSetScale(<0.01, 0.01, 0.01>); llSetAlpha(0.0, ALL_SIDES); } default { state_entry() { owner = llGetOwner(); } touch_start(integer n) { llRequestPermissions(owner, PERMISSION_CHANGE_LINKS); } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezRectangles(); setInvisible(); } } object_rez(key id) { llCreateLink(id, TRUE); } } |
これで、X軸方向に 3m, Y軸方向に 4m, Z軸方向に 5m の直方体(の6面)が作成され、中心の小さな見えない prim に link されます。
1行目の vector の値を変更することにより、各辺を 10m までの範囲で、変更することができます。
Tags: programming, second_life