2012/06/05

テレポート


上空にはアダルトショップもあって、地上のお店の端っこにあるテレポーター(デモ商品)を使って行けます。
タッチするとメニューが出て行先を選べ、うにうにと出現する怪しげな物体に座ると、それが目的地まで運んでくれるしかけです。

目的地まで運ぶしくみは、スクリプトの中で、プリムのパラメーター設定をする llSetPrimitiveParams() を使っています。
人が座っているオブジェクトを移動させるためで、位置設定の llSetPos(<x,y,z>) と同じことをするため、llSetPrimitiveParams([PRIM_POSITION, <x,y,z>])というふうに書きます。
なぜこちらを使うかというと、llSetPos() で動ける距離が10mしかなく、遠くに行くためには何度も繰り返さないといけないのですが、繰り返すたびに0.2秒休憩してしまうので、時間もかかり、テレポという感じじゃなくなります。
このことは llSetPrimitiveParams() でも同じなのですが、裏技があって、[PRIM_POSITION, <x,y,z>, PRIM_POSITION, <x,y,z>,...]というふうに同じことを繰り返して書いておけば、(10mづつ)何度動いても休憩は1回だけ、なので一瞬で行ったようになります。
そこで、行先までの距離を10mで割って、何回繰り返すか調べ、その回数分の長~いリスト[PRIM_POSITION, <x,y,z>, PRIM_POSITION, <x,y,z>,...]を作って、それで llSetPrimitiveParams() を呼び出すわけです。

スクリプトで書くと、こうなります。
jumpPos(vector pos) { // posは目的地の<x,y,z>
 list rules = [];
 integer n = (integer)(llVecDist(pos, llGetPos()) / 10.0) + 1;
 for ( ; 0<n; --n ) rules += [ PRIM_POSITION, pos ];
 llSetPrimitiveParams(rules);
}
llSetPrimitiveParams()の詳しい説明はこちら
http://wiki.secondlife.com/wiki/LlSetPrimitiveParams/ja
築地のお店はこちら(SLurl)
http://slurl.com/secondlife/TSUKIJI/90/47/22/