まずは、8つのオブジェクトに、"cube 10m ---", "cube 10m ---+", ..., "cube 10m +++" と名付けて、take します。符号は、順に、X, Y, Z軸の、どちらの surface をもつかを示します。例えば、"---" は、西、南、下の 3つの面をもつことをあらわします。
次は、上記のオブジェクトを rez して link するスクリプトです。
rezCube(string object, vector pos) { llRezObject(object, pos, <0.0, 0.0, 0.0>, ZERO_ROTATION, 0); } rezCubes() { string name = "cube 10m "; vector pos = llGetPos(); rezCubesX(name, pos); } rezCubesX(string name, vector pos) { rezCubesY(name + "-", pos + <-5.0, 0.0, 0.0>); rezCubesY(name + "+", pos + < 5.0, 0.0, 0.0>); } rezCubesY(string name, vector pos) { rezCubesZ(name + "-", pos + <0.0, -5.0, 0.0>); rezCubesZ(name + "+", pos + <0.0, 5.0, 0.0>); } rezCubesZ(string name, vector pos) { rezCube(name + "-", pos + <0.0, 0.0, -5.0>); rezCube(name + "+", pos + <0.0, 0.0, 5.0>); } setInvisible() { llSetScale(<0.01, 0.01, 0.01>); llSetAlpha(0.0, ALL_SIDES); } default { state_entry() { } touch_start(integer n) { key owner = llGetOwner(); integer i; for (i = 0; i < n; i++) { if (llDetectedKey(i) == owner) { llRequestPermissions(owner, PERMISSION_CHANGE_LINKS); } } } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezCubes(); setInvisible(); } } object_rez(key id) { llCreateLink(id, TRUE); } } |
このスクリプトと上記の 8つのオブジェクトを入れた prim を touch することにより、一辺 20m の cube が、ひとつのオブジェクトとして、作成できます。いったん、link されてしまえば、contents の内容は、すべて削除してもかまいません。これで、例えば、object の編集で、texture を一気に変更すること、などができるようになります。もちろん、rez や take も、1回の操作で、できます。
その後、30m cube の作成にもチャレンジしてみましたが、llRezObject() の制限にひっかかってきました。11/30 には、各軸で、20m が制限らしいと書きましたが、今日の結果では、root position の直線距離で、17m が限界のようです。例えば、一辺 10m の立方体を 2つ並べることを考えます。ひとつの面を共有するように並べた場合、中心間の距離は、1
Tags: programming, second_life