LlApplyImpulse/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llApplyImpulse( vector force, integer local );

オブジェクトに衝撃を加えます。

• vector force
• integer local 真偽値がTRUEの場合、forceリージョン方向ベクトルの代わりにローカル方向ベクトルとして扱われます。

瞬間的な衝撃です。llSetForce が継続的な押しになります。"瞬間的な" というのは 1 秒の衝撃と思われます。(kg単位での) オブジェクトの質量と同じ (ニュートン単位で) 力を 1 秒間加え続けると、速度を 1 (メートル/秒) 上昇させるためで、これがこの関数で起こっていることのようだからです。

警告

  • オブジェクトは物理属性にしてください。
  • 物体の質量中心に初期運動量を設定します。運動量とは、物体が他の力(重力など)の影響を受けていない場合に、最初の速度の動きを得るために必要な質量*速度のことです。
  • 運動量の大きさは、物体の利用可能なエネルギーによって縮小されます。重い物体の場合、運動量の上限は運動量=20000となります。(先に述べた20ではありません)速い物体の場合、速度の上限は202m/秒になります(したがって、運動量はこの上限を反映します)。

サンプル

<source lang="lsl2"> //オブジェクトを rez して、スクリプトをその中に入れます。 //オーナーに向けて発射します。 default {

   state_entry()
   {
       key ownerKey = llGetOwner();
       vector ownerPosition = llList2Vector(llGetObjectDetails(ownerKey, [OBJECT_POS]), 0);

// オーナーがSIMにいない場合は、ふざけたことをしないように

       if (llGetAgentSize(ownerKey) == ZERO_VECTOR)
           return;

// else

       llSetStatus(STATUS_PHYSICS, TRUE);

       vector objectPosition = llGetPos();
       vector direction = llVecNorm(ownerPosition - objectPosition);

       llApplyImpulse(direction * 100, 0);
   }

} </source> 自分でビール缶を作って、このスクリプトをそこに入れて、射撃の練習をしてみてください。 <source lang="lsl2"> vector gHome; integer gHit;

default {

   collision_start(integer num)
   {
       if (!gHit)
       {
           llSetTimerEvent(15.0);
           gHome = llGetPos();
           gHit = TRUE;
       }
       llSetStatus(STATUS_PHYSICS, TRUE);
       llTriggerSound("b90ed62a-2737-b911-bb53-6b9228bbc933",1.0);
       llApplyImpulse(llGetMass()*<0,0,5.0>,TRUE);
       llApplyRotationalImpulse(llGetMass()*<llFrand(1.0),llFrand(1.0),llFrand(1.0)>,TRUE);
       llResetTime();
   }

   land_collision(vector where)
   {
       if (llGetTime() < 0.5)
       {
           llResetTime();
           llApplyImpulse(llGetMass()*<0,0,llFrand(1.0)>,TRUE);
           llApplyRotationalImpulse(llGetMass()*<llFrand(1.0),llFrand(1.0),llFrand(1.0)>,TRUE);
       }
   }

   timer()
   {
       llSetStatus(STATUS_PHYSICS,FALSE);
       gHit = FALSE;
       llSetRegionPos(gHome);  // 10m以上離れていても、缶を戻せます
       llSetRot(ZERO_ROTATION);
       llSetTimerEvent(0.0);
   }

} </source> <source lang="lsl2"> // 使えないスクリプト、ただのデモです。 // パラメーターは力ではなく勢いです。 // 他の力(衝突や重力)がない場合、初速度*質量=運動量となります。 // 運動量の上限は20ではありません。 // 速度の上限が200m/秒程度であるため、それにもかかわらず運動量に上限がある場合があります。この場合、200m/s * 質量が上限となります。

integer tid;
vector initPos;
vector Impulse;

default {

   state_entry()
   {
       llSetPhysicsMaterial(GRAVITY_MULTIPLIER,0,0,0,0);
       llSetStatus(STATUS_PHANTOM, TRUE);      
       llSetStatus(STATUS_PHYSICS, TRUE);


   }

   touch_end(integer n)
   {
       tid=llTarget(initPos=llGetPos(),30);
       llSetStatus(STATUS_PHYSICS, TRUE);
       Impulse = llGetMass()*<0,0,25>;
        llOwnerSay(llList2Json(JSON_ARRAY, [ "Setup a Momentum=", Impulse  ]));
       llApplyImpulse( Impulse , FALSE);
   }
   moving_start()
   {
       llOwnerSay(llList2Json(JSON_ARRAY, [ "Velocity= ", llGetVel(), "Force=",llGetMass()*llGetAccel(), "Momentum=", llGetVel()*llGetMass()]));
   } 
   not_at_target()
   {
       llSetTimerEvent(0.0);
       llTargetRemove(tid);
       llSetStatus(STATUS_PHYSICS, FALSE);
       llSetRegionPos(initPos);

   } 

}

// Example of results // ["Setup a Momentum=","<0.000000, 0.000000, 183.181381>"] // [10:19] Object: ["Velocity=","<0.000000, 0.000000, 25.000002>","Force=","<0.000000, 0.000000, -0.171902>","Momentum=","<0.000000, 0.000000, 183.181396>"]

// And for an heavy object, the cap is 20000 // ["Setup a Momentum=","<0.000000, 0.000000, 28244.332031>"] // [11:01] Object: ["Velocity=","<0.000000, 0.000000, 17.702671>","Force=","<0.000000, 0.000000, -28.363781>","Momentum=","<0.000000, 0.000000, 20000.005859>

</source>

関連項目

関数

•  llApplyRotationalImpulse
•  llSetForce 持続的な力を設定します

特記事項

Search JIRA for related Issues

Signature

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