まずは、prim をひとつ作成して、size を 10m x 10m x 1m とします。名前は、"square 10m" として、take して、自分の inventory に取り込みます。これを、rez して、この中に、同じ "square 10m" を入れ、次の script を作成します。
string square10 = "square 10m"; key owner; integer count = 8; list squares = []; rezSquares() { vector pos = llGetPos(); integer i; for (i = -1; i < 2; i++) { integer j; for (j = -1; j < 2; j++) { if (i != 0 || j!= 0) { llRezAtRoot(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 = 0; for ( ; i < total_number; i++) { if (llDetectedKey(i) == owner) { llRequestPermissions(owner, PERMISSION_CHANGE_LINKS); } } } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezSquares(); } } object_rez(key id) { squares += id; count --; if (count == 0) { integer i; for (i = 0; i < 8; i++) { llCreateLink(llList2Key(squares, i), TRUE); } } } } |
Root になる、もともとの prim の inventory にある 10m 四方の prim を、8回 rez して、自分のまわりに並べます。これだけでも、一応 30m 四方の square ができますが、移動したり、take などの操作では、別々の 9個の object として扱わなければならないので、面倒です。そこで、llCreateLink() で、周辺の prim を、中央の root prim に、link しています。Link を変更するためには、runtime permission が必要になるため、最初に、llRequestPermissions() で、owner に permission を要求しています。
なお、一定の距離以上(多分、10m 以上)離れていると、llRezAtRoot() や llRezObject(), また、llCreateLink() が失敗します。また、このときに、object の root position で計算しているのか、center position なのかで、状況が変わってきます。このため、上記のスクリプトでは、llRezAtR
昨日と同様に、30m square の object を 3776m の上空に浮かべて、記念写真をとりました。
Tags: programming, second_life