LlSitTarget/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llSitTarget( vector offset, rotation rot );

プリムの着座ポイントを設定します。着座位置はプリムの位置や回転に相対するものです。

• vector offset プリムのローカル座標での、追加する着座ポイントの位置。
• rotation rot プリムの回転に対する、追加する着座ポイントの回転。

offset == <0.0, 0.0, 0.0> の場合、着座ポイントは削除されます。

仕様

llSitTarget はエージェントターゲット (Advanced -> Character -> View Agent Target) の位置を設定します。このターゲットの位置は rotoffset に基づいています[1]

警告

  • いったん着座ポイントが除去されると、 llAvatarOnSitTarget は常に NULL_KEY を返すようになります。
  • 着座ポイントを設定したスクリプトを削除したり停止したりしても、プリムの着座ポイントは削除されません。
    • 着座ポイントはプリムのプロパティであり、スクリプトが存在しつづけなければならないものではありません。
  • 着座ポイントを削除するには、次のようにします:

<lsl>llSitTarget(ZERO_VECTOR,ZERO_ROTATION);</lsl>

  • 着座ポイントのあるプリムを Shift コピーしたとき、スクリプトで着座ポイントを再設定しなければ、コピーされたものに着座ポイントは維持されません。 (Shift コピーすると、コピーされたものは元の位置にあります。)
  • パイメニューから「ここに座る」オプションを除去する方法はありません。
    • llSetSitText に " " 空白や、その他見えない文字を llSetSitText に設定すると、削除されたように見えることになります。
  • アタッチメントの上に座ることはできません。
  • rot は着座ポイントの位置に不条理に影響します[2]
    • llSetLinkPrimitiveParams が、手っ取り早い回避策です。
    • アニメーションはエージェントターゲットに相対するものですが、エージェントターゲットはアニメーションで表されるものではありません。
  • llSitTarget は既に座っているアバターの位置を更新しません。
  • offset は各軸について 300.0 メートルまでに制限されています。 x, y, z 座標は [-300, 300.0] の範囲になければなりません[2]
    • 範囲外の場合、最も近い制限値に丸められます。

サンプル

<lsl>default {

   state_entry()
   {
       llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION); //動作させるためには、ベクトル要素は全て 0 にしてはいけません。
   }
}</lsl>

便利なスニペット

着座ポイントを更新

<lsl>//必要であれば、アバターを移動させつつ、着座ポイントを設定更新します。 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</lsl>

着座ポイントを取得

<lsl>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>

関連項目

イベント

•  changed

関数

•  llSetSitText
•  llAvatarOnSitTarget
•  llUnSit

特記事項

Search JIRA for related Issues

脚注

  1. ^ rot は位置に影響してはいけないはずと多くの人が考えていますが、残念なことに着座ポイントの実装は "Wikipedia logo"溶岩流 (lava-flow) です。 ~ SVC-2277
  2. ^ 記事中の範囲は、 実数空間 に記載されているものです。

Signature

function void llSitTarget( vector offset, rotation rot );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。