Prim の形状(building block type)には、今まで使用してきた Box の他にも、Cylinder (円柱), Sphere (球), Torus (ドーナツ形)などがあります。今回は、正三角形の面があるので、Prism (三角錐)を使ってみます。これで、X, Y軸方向の長さを 10m にセットしたところ、大きな正三角形がでてきました。しかし、一辺 10m の正方形よりは、ひとまわり小さく、一辺が 10m はないようです。そこで、タイルの texture を貼付けてみたところ、高さが 7.5m で、中心は、1/3 の、底辺から 2.5m のところにあることがわかりました。ちなみに、高さの方向は、X軸で、頂点が (5.0, 0), 底辺が x=-2.5 です。このため、底面の正方形の一辺の長さは、7.5 * 2 / sqrt(3) = 5 * sqrt(3) = 8.66025m となります。つまり、すべての辺が 8.66m の正四角錐を作ることになります。
まずは、一辺 8.66025m の正方形の prim を作成して、その中に、上記の正三角形の prim を入れます。あとは、この正三角形を 4回、適当に回転して、適切な位置に rez して link するスクリプトを入れて、実行するだけです。しかし、その position と rotation を求めるのが、簡単ではありません。まずは、スクリプトから、紹介します。
rezTriangles() { vector p = llGetPos(); llRezAtRoot("triangle", p + <-2.88675, 0.0, 2.04124>, <0.0, 0.0, 0.0>, llEuler2Rot(<0.0, -0.95532, 0.0>), 0); llRezAtRoot("triangle", p + < 2.88675, 0.0, 2.04124>, <0.0, 0.0, 0.0>, llEuler2Rot(<0.0, PI+0.95532, 0.0>), 0); llRezAtRoot("triangle", p + <0.0,-2.88675, 2.04124>, <0.0, 0.0, 0.0>, llEuler2Rot(< 0.95532, 0.0, PI_BY_TWO>), 0); llRezAtRoot("triangle", p + <0.0, 2.88675, 2.04124>, <0.0, 0.0, 0.0>, llEuler2Rot(<-0.95532, 0.0, -PI_BY_TWO>), 0); } default { state_entry() { } touch_start(integer total_number) { llRequestPermissions(llGetOwner(), PERMISSION_CHANGE_LINKS); } run_time_permissions(integer perm) { if (perm & PERMISSION_CHANGE_LINKS) { rezTriangles(); } } object_rez(key id) { llCreateLink(id, TRUE); } } |
まず、最初の面ですが、X軸とZ軸を含む平面で考えると、正三角錐の高さの平方は、(7.5)
また、rotation については、Y軸の上(北)から見て、負の方向に回転する必要があります。ここでは、p
$ python Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26) >>> from math import sqrt >>> from math import atan2 >>> 5*sqrt(3) 8.6602540378443855 >>> 5*sqrt(6)/2 6.1237243569579451 >>> atan2( sqrt(6), sqrt(3) ) 0.9553166181245093 >>> |
ひとつ決まれば、あとの 3つは、符号を変えたり、軸を変えたり、rotation に関しては、PI (180度)や PI_BY_TWO (90度) だけ調整することにより、試行錯誤でも得られます。
Tags: programming, second_life