LlSitTarget/ja
From Second Life Wiki
Second Life Wiki > LlSitTarget/ja
Contents |
要約
関数: llSitTarget( vector offset, rotation rot );プリムの着座ポイントを設定します。着座位置はプリムの位置や回転に相対するものです。
| • vector | offset | – | プリムのローカル座標での、追加する着座ポイントの位置。 | |
| • rotation | rot | – | プリムの回転に対する、追加する着座ポイントの回転。 |
offset == <0.0, 0.0, 0.0> の場合、着座ポイントは削除されます。
仕様
llSitTarget はエージェントターゲット (Advanced -> Character -> View Agent Target) の位置を設定します。このターゲットの位置は rot と offset に基づいています[1]。
警告
- いったん着座ポイントが除去されると、 llAvatarOnSitTarget は常に NULL_KEY を返すようになります。
- 着座ポイントを設定したスクリプトを削除したり停止したりしても、プリムの着座ポイントは削除されません。
- 着座ポイントはプリムのプロパティであり、スクリプトが存在しつづけなければならないものではありません。
- 着座ポイントを削除するには、次のようにします:
llSitTarget(ZERO_VECTOR,ZERO_ROTATION);
- 着座ポイントのあるプリムを Shift コピーしたとき、スクリプトで着座ポイントを再設定しなければ、コピーされたものに着座ポイントは維持されません。 (Shift コピーすると、コピーされたものは元の位置にあります。)
- パイメニューから「ここに座る」オプションを除去する方法はありません。
- llSetSitText に " " 空白や、その他見えない文字を llSetSitText に設定すると、削除されたように見えることになります。
- アタッチメントの上に座ることはできません。
- rot は着座ポイントの位置に不条理に影響します[2]。
- llSetLinkPrimitiveParams が、手っ取り早い回避策です。
- アニメーションはエージェントターゲットに相対するものですが、エージェントターゲットはアニメーションで表されるものではありません。
- llSitTarget は既に座っているアバターの位置を更新しません。
- 以下で説明する 着座ポイントを更新 で、この問題を回避できます。着座ポイントの情報をリンク位置に変え、それを llSetLinkPrimitiveParams に渡すことで実現します。
- offset は各軸について 300.0 メートルまでに制限されています。 x, y, z 座標は [-300, 300.0] の範囲になければなりません[2]。
- 範囲外の場合、最も近い制限値に丸められます。
サンプル
default { state_entry() { llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION); //動作させるためには、ベクトル要素は全て 0 にしてはいけません。 } }
便利なスニペット
着座ポイントを更新
//必要であれば、アバターを移動させつつ、着座ポイントを設定更新します。 UpdateSitTarget(vector pos, rotation rot) {//移動中のオブジェクトにこれを使うと、予期しない結果となる可能性があります。 llSitTarget(pos, rot);//着座ポイントを設定 key user = llAvatarOnSitTarget(); if(user)//着座ポイントにユーザが座っていれば true となり、そうであれば、その人の位置を更新します。 { vector size = llGetAgentSize(user); if(size)//ユーザが本当にいるか確かめるための条件文です { //位置と回転を現在のプリムのローカルにする必要があります rotation localrot = ZERO_ROTATION; vector localpos = ZERO_VECTOR; if(llGetLinkNumber() > 1)//ルートプリムでなければ、ローカル回転だけが必要です { localrot = llGetLocalRot(); localpos = llGetLocalPos(); } pos.z += 0.4; integer linkNum = llGetNumberOfPrims(); do{ if(user == llGetLinkKey( linkNum ))//インデックスが不正でないか確認しています { llSetLinkPrimitiveParams(linkNum, [PRIM_POSITION, ((pos - (llRot2Up(rot) * size.z * 0.02638)) * localrot) + localpos, PRIM_ROTATION, rot * localrot / llGetRootRotation()]); jump end;//安直ですが、 return よりちょっと遅いです } }while( --linkNum ); } else {//着座ポイントが壊れることはめったいにないですが、起こりえます。これでそれをなんとかできます。 llUnSit(user); } } @end; }//Written by Strife Onizuka, size adjustment provided by Escort DeFarge
着座ポイントを取得
list GetSitTarget(integer prim, key av) {//警告: llGetObjectDetails は小数点第 5 位までの誤差を発生させる可能性があります! //何回も何回も計算しない限りは、気づく可能性は非常に低いです。 //(移動する乗り物の中など) 移動中に使用しないでください!!! vector tp = llGetAgentSize(av); if(tp) { if(prim == LINK_THIS)//llGetLinkKey は LINK_THIS と相性が悪いです prim = llGetLinkNumber(); list details = [OBJECT_POS, OBJECT_ROT]; rotation f = llList2Rot(details = (llGetObjectDetails(llGetLinkKey(prim), details) + llGetObjectDetails(av, details)), 1); rotation r = llList2Rot(details, 3) / f; return [((llList2Vector(details, 2) - llList2Vector(details, 0)) / f) + (llRot2Up(r) * tp.z * 0.02638) - <0.0, 0.0, 0.4>, r]; } return []; }//Written by Strife Onizuka
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。

