Difference between revisions of "LlSitTarget/ja"

From Second Life Wiki
Jump to navigation Jump to search
(New page: {{LSL_Function/ja |func_id=238|func_sleep=0.0|func_energy=10.0 |sort=SitTarget |func=llSitTarget |p1_type=vector|p1_name=offset|p1_desc=sit targetのローカル位置を付加調整。 ...)
 
 
(3 intermediate revisions by one other user not shown)
Line 3: Line 3:
|sort=SitTarget
|sort=SitTarget
|func=llSitTarget
|func=llSitTarget
|p1_type=vector|p1_name=offset|p1_desc=sit targetのローカル位置を付加調整。
|p1_type=vector|p1_name=offset|p1_desc=プリムのローカル座標での、追加する着座ポイントの位置。
|p2_type=rotation|p2_name=rot|p2_desc=sit targetのローカル回転を付加調整。
|p2_type=rotation|p2_name=rot|p2_desc=プリムの回転に対する、追加する着座ポイントの回転。
|func_footnote='''offset'''[[ZERO_VECTOR|{{LSL VR|0.0|0.0|0.0}}]]の場合、sit targetは取り除かれます。
|func_footnote='''offset''' == [[ZERO_VECTOR/ja|{{LSL VR|0.0|0.0|0.0}}]] の場合、着座ポイントは削除されます。
|func_desc=このオブジェクトの座る位置を設定します。
|func_desc=プリムの着座ポイントを設定します。着座位置はプリムの位置や回転に相対するものです。
|return_text
|return_text
|spec
|spec=llSitTarget はエージェントターゲット (Advanced -> Character -> View Agent Target) の位置を設定します。このターゲットの位置は '''rot''' と '''offset''' に基づいています{{Footnote|'''rot''' は位置に影響してはいけないはずと多くの人が考えていますが、残念なことに着座ポイントの実装は {{Wikipedia|アンチパターン#.E3.83.97.E3.83.AD.E3.82.B0.E3.83.A9.E3.83.9F.E3.83.B3.E3.82.B0.E3.81.AE.E3.82.A2.E3.83.B3.E3.83.81.E3.83.91.E3.82.BF.E3.83.BC.E3.83.B3|溶岩流 (lava-flow)|lang=ja}} です。 ~ {{JIRA|SVC-2277}}|'''rot''' は位置に影響してはいけないはずと多くの人が考えていますが、残念なことに着座ポイントの実装は溶岩流 (lava-flow) です。 - SVC-2277|handle=rot-offset}}。
|caveats=*一度SitTargetを除去すると、[[llAvatarOnSitTarget/ja|llAvatarOnSitTarget]]は{{LSL_Constant/NULL_KEY/ja}}のみを返します。
|caveats=*いったん着座ポイントが除去されると、 {{LSLG/ja|llAvatarOnSitTarget}} は常に {{LSL_Constant/NULL_KEY/ja}} を返すようになります。
*パイメニューからsitオプションを除去する方法はありません。
*着座ポイントを設定したスクリプトを削除したり停止したりしても、プリムの着座ポイントは削除されません。
**[[llSetSitText/ja|llSetSitText]]にスペースの" "を設定した場合、取り除かれた表示になるでしょう。
**着座ポイントはプリムのプロパティであり、スクリプトが存在しつづけなければならないものではありません。
*アタッチメント上には設定できません。
*着座ポイントを削除するには、次のようにします:
*[[llSitTarget/ja|llSetTarget]]は既にアバターが座っている位置の更新はしません。
<source lang="lsl2">llSitTarget(ZERO_VECTOR,ZERO_ROTATION);</source>
**[[#UpdateSitTarget|UpdateSitTarget]]はこの問題周りの以下の動きが記述されています。 [[llSetLinkPrimitiveParams/ja|llSetLinkPrimitiveParams]]にそって通されたリンク位置にsit targetの情報が変更するように動きます。
*着座ポイントのあるプリムを Shift コピーしたとき、スクリプトで着座ポイントを再設定しなければ、コピーされたものに着座ポイントは維持されません。 (Shift コピーすると、コピーされたものは元の位置にあります。)
*パイメニューから「ここに座る」オプションを除去する方法はありません。
**{{LSLG/ja|llSetSitText}} に "&nbsp;" 空白や、その他見えない文字を {{LSLG/ja|llSetSitText}} に設定すると、削除されたように見えることになります。
*アタッチメントの上に座ることはできません。
*'''rot''' は着座ポイントの位置に不条理に影響します{{Interval/Footnote/ja}}。
**{{LSLG/ja|llSetLinkPrimitiveParams}} が、手っ取り早い回避策です。
**アニメーションはエージェントターゲットに相対するものですが、エージェントターゲットはアニメーションで表されるものではありません。
*{{LSLG/ja|llSitTarget}} は既に座っているアバターの位置を更新しません。
**以下で説明する [[#UpdateSitTarget|着座ポイントを更新]] で、この問題を回避できます。着座ポイントの情報をリンク位置に変え、それを {{LSLG/ja|llSetLinkPrimitiveParams}} に渡すことで実現します。
* '''offset''' は各軸について 300.0 メートルまでに制限されています。 x, y, z 座標は {{Interval|lte=300.0|gte=-300}} の範囲になければなりません{{Footnote|handle=interval}}。
** 範囲外の場合、最も近い制限値に丸められます。
|constants
|constants
|examples=
|examples=
<lsl>default
<source lang="lsl2">default
{
{
     state_entry()
     state_entry()
     {
     {
         llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION); //The vector's components must not all be set to 0 for effect to take place.
         llSitTarget(<0.0, 0.0, 1.0>, ZERO_ROTATION); //動作させるためには、ベクトル要素は全て 0 にしてはいけません。
     }
     }
}</lsl>
}</source>
|helpers= ===SitTargetを更新===
|helpers= ===着座ポイントを更新{{Anchor|UpdateSitTarget}}===
<lsl>//Sets / Updates the sit target moving the avatar on it if necessary.
<source lang="lsl2">//必要であれば、アバターを移動させつつ、着座ポイントを設定更新します。
UpdateSitTarget(vector pos, rotation rot)
UpdateSitTarget(vector pos, rotation rot)
{//Using this while the object is moving may give unpredictable results.
{//移動中のオブジェクトにこれを使うと、予期しない結果となる可能性があります。
     llSitTarget(pos, rot);//Set the sit target
     llSitTarget(pos, rot);//着座ポイントを設定
     key user = llAvatarOnSitTarget();
     key user = llAvatarOnSitTarget();
     if(user)//true if there is a user seated on the sittarget, if so update their position
     if(user)//着座ポイントにユーザが座っていれば true となり、そうであれば、その人の位置を更新します。
     {
     {
         vector size = llGetAgentSize(user);
         vector size = llGetAgentSize(user);
         if(size)//This tests to make sure the user really exists.
         if(size)//ユーザが本当にいるか確かめるための条件文です
         {
         {
             //We need to make the position and rotation local to the current prim
             //位置と回転を現在のプリムのローカルにする必要があります
             rotation localrot = ZERO_ROTATION;
             rotation localrot = ZERO_ROTATION;
             vector localpos = ZERO_VECTOR;
             vector localpos = ZERO_VECTOR;
             if(llGetLinkNumber() > 1)//only need the local rot if it's not the root.
             if(llGetLinkNumber() > 1)//ルートプリムでなければ、ローカル回転だけが必要です
             {
             {
                 localrot = llGetLocalRot();
                 localrot = llGetLocalRot();
Line 46: Line 56:
             integer linkNum = llGetNumberOfPrims();
             integer linkNum = llGetNumberOfPrims();
             do{
             do{
                 if(user == llGetLinkKey( linkNum ))//just checking to make sure the index is valid.
                 if(user == llGetLinkKey( linkNum ))//インデックスが不正でないか確認しています
                 {
                 {
                     llSetLinkPrimitiveParams(linkNum,
                     llSetLinkPrimitiveParams(linkNum,
                                             [PRIM_POSITION, ((pos - (llRot2Up(rot) * size.z * 0.02638)) * localrot) + localpos,
                                             [PRIM_POSITION, ((pos - (llRot2Up(rot) * size.z * 0.02638)) * localrot) + localpos,
                                             PRIM_ROTATION, rot * localrot / llGetRootRotation()]);
                                             PRIM_ROTATION, rot * localrot / llGetRootRotation()]);
                     jump end;//cheaper but a tad slower then return
                     jump end;//安直ですが、 return よりちょっと遅いです
                 }
                 }
             }while( --linkNum );
             }while( --linkNum );
         }
         }
         else
         else
         {//It is rare that the sit target will bork but it does happen, this can help to fix it.
         {//着座ポイントが壊れることはめったいにないですが、起こりえます。これでそれをなんとかできます。
             llUnSit(user);
             llUnSit(user);
         }
         }
     }
     }
     @end;
     @end;
}//Written by Strife Onizuka, size adjustment provided by Escort DeFarge</lsl>
}//Written by Strife Onizuka, size adjustment provided by Escort DeFarge</source>
===SitTargetを取得===
===着座ポイントを取得===
<lsl>list GetSitTarget(integer prim, key av)
<source lang="lsl2">list GetSitTarget(integer prim, key av)
{//WARNING: llGetObjectDetails can introduce an error that goes as far as the 5th decimal place!
{//警告: llGetObjectDetails は小数点第 5 位までの誤差を発生させる可能性があります!
  //This is highly unlikely to be ever noticed unless compounded over time.
  //何回も何回も計算しない限りは、気づく可能性は非常に低いです。
  //Do not use while moving (like in a moving vehicle)!!!
  //(移動する乗り物の中など) 移動中に使用しないでください!!!
     vector tp = llGetAgentSize(av);
     vector tp = llGetAgentSize(av);
     if(tp)
     if(tp)
     {
     {
         if(prim == LINK_THIS)//llGetLinkKey doesn't like LINK_THIS
         if(prim == LINK_THIS)//llGetLinkKey LINK_THIS と相性が悪いです
             prim = llGetLinkNumber();
             prim = llGetLinkNumber();
          
          
Line 80: Line 90:
     }
     }
     return [];
     return [];
}//Written by Strife Onizuka</lsl>
}//Written by Strife Onizuka</source>
|also_functions={{LSL DefineRow||[[llSetSitText/ja|llSetSitText]]|}}
|also_functions={{LSL DefineRow||{{LSLG/ja|llSetSitText}}|}}
{{LSL DefineRow||[[llAvatarOnSitTarget/ja|llAvatarOnSitTarget]]|}}
{{LSL DefineRow||{{LSLG/ja|llAvatarOnSitTarget}}|}}
{{LSL DefineRow||[[llUnSit/ja|llUnSit]]|}}
{{LSL DefineRow||{{LSLG/ja|llUnSit}}|}}
|also_events={{LSL DefineRow||[[changed/ja|changed]]|}}
|also_events={{LSL DefineRow||{{LSLG/ja|changed}}|}}
|also_articles
|also_articles
|notes
|notes
Line 92: Line 102:
|cat4=Effects
|cat4=Effects
|cat5=Teleport
|cat5=Teleport
|cat6
|cat6=Stop
}}
}}

Latest revision as of 14:09, 25 February 2016

要約

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

サンプル

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

関連項目

イベント

•  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の関連した項目が参考になるかもしれません。