このため、正方形の大きな object を作成しようとした時には、今まで紹介したように、ひとつの object としては、30m まで、また、ひとつの script から複数の object を rez する場合には 50m というのが、限界のようです。ただし、後者に対しては、複数の入れ子になった object を用意して、 on_rez() イベントで、連鎖的に行う場合には、もっと大きなものが作れると思います。
なお、11/29 のタイルの 50m square floor は、厚さを 1m で作成しましたが、smoke texture に変更して、厚さも 0.01m に変更しようとしたところ、texture はすべてに適用されましたが、size (scale) は、root object にだけ適用されました。このため、表面がでこぼこになってしまったため、作り直しまし
まずは、右上に配置する 30m(東西, X軸) x 20m(南北, Y軸)の長方形の object を作成します。このために、まず、prim をひとつ作成して、size を 10m x 10m x 0.01m にし、Smoke Texture を貼付けます。これを、"square 10m" と名付けて、いったん inventory に取り込みます。これを、再び rez して、この中に、同じ "square 10m" を入れ、次のようなスクリプトを新規作成します。
string square10 = "square 10m"; key owner; rezObjects() { vector pos = llGetPos(); integer i; for (i = -1; i < 2; i++) { integer j; for (j = 0; j < 2; j++) { if (i != 0 || j != 0) { llRezObject(square10, pos + <10.0 * (float)i, 10.0 * (float)j, 0.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); } } } } default { state_entry() { owner = llGetOwner(); } touch_start(integer total_number) { integer i; for (i = 0; i < total_number; i++) { if (llDetectedKey(i) == owner) { llRequestPermissions(owner, PERMISSION_CHANGE_LINKS); } } } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezObjects(); } } object_rez(key id) { llCreateLink(id, TRUE); } } |
これを実行して、touch すると、目的の 30m x 20m の長方形の object ができます。Contents にある "square 10m" とスクリプトは、用済みなので削除します。これを、"rectangle 30x20-1" と名付けて、inventory に取り込んでおきます。
同様にして、左上に配置される 20m x 30m の "rectangle 20x30-2" を、さらに、左下の "rectangle 30x20-3", 右下の "rectangle 20x30-4" を作成します。
次に、中心となる "square 10m" を rez して、この中に、上記の 4つの大きな長方形の objects を入れます。これに、次のようなスクリプトを新規作成します。
makeLargeSquare() { vector pos = llGetPos(); llRezAtRoot("rectangle 30x20-1", pos + < 10.0, 10.0, 0.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); llRezAtRoot("rectangle 20x30-2", pos + <-10.0, 10.0, 0.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); llRezAtRoot("rectangle 30x20-3", pos + <-10.0, -10.0, 0.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); llRezAtRoot("rectangle 20x30-4", pos + < 10.0, -10.0, 0.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); } default { state_entry() { } on_rez(integer param) { makeLargeSquare(); } } |
これを、"square 10m to 50m on rez" と名付けて、inventory に取り込みます。後は、この 10m square の prim を rez すると、まわりに 4つの大きな長方形が rez されて、50m の正方形ができます。ただし、link は、されていないので、独立した 5つの objects として、扱われます。
また、普通に rez してしまうと、地上に 50m squre ができてしまいます。そこで、もう一工夫します。別の適当な大きさの prim を作成して、上記の "square 10m to 50m on rez" と次のスクリプトをいれます。
default { state_entry() { } touch_start(integer n) { if (llDetectedKey(0) == llGetOwner()) { vector p = llGetPos(); llRezObject("square 10m to 50m on rez", p + <0.0, 0.0, -1.0>, <0.0, 0.0, 0.0>, <0.0, 0.0, 0,0>, 0); } } } |
これに、座ってから、object の edit window から、position の Z に 4096.0 以下の大きな値を入力します。これで、座ったまま、一気に上空に移動するので、そこで touch すると、上記の snapshot のように、足下を中心に、50m 四方の正方形の床ができます。
2008-12-04 update
(*) -> 20m Cube (#2 linked) - LSL #14 - SL #23 .. 17m !?
Tags: programming, second_life