Difference between revisions of "LlApplyImpulse/ja"

From Second Life Wiki
Jump to navigation Jump to search
m
 
(5 intermediate revisions by 3 users not shown)
Line 7: Line 7:
|p2_type=integer
|p2_type=integer
|p2_name=local
|p2_name=local
|p2_desc=真偽値が[[TRUE/ja|TRUE]]の場合、'''force'''は[[Viewer coordinate frames#Region|リージョン]]方向ベクトルの代わりに[[Viewer coordinate frames#Local|ローカル]]方向ベクトルとして扱われます。
|p2_hover=boolean, if TRUE, force is treated as a local directional vector instead of region directional vector.
|func_footnote=瞬間的な衝撃です。llSetForceは持続的な押し込みです。
|p2_desc=真偽値が[[TRUE/ja|TRUE]]の場合、'''force'''は[[Viewer coordinate frames/ja#Region|リージョン]]方向ベクトルの代わりに[[Viewer coordinate frames/ja#Local|ローカル]]方向ベクトルとして扱われます。
|func_footnote=瞬間的な衝撃です。{{LSLG/ja|llSetForce}} が継続的な押しになります。"瞬間的な" というのは 1 秒の衝撃と思われます。(kg単位での) オブジェクトの質量と同じ (ニュートン単位で) 力を 1 秒間加え続けると、速度を 1 (メートル/秒) 上昇させるためで、これがこの関数で起こっていることのようだからです。
|func_desc=オブジェクトに衝撃を加えます。
|func_desc=オブジェクトに衝撃を加えます。
|return_text|spec
|return_text|spec
|caveats=*オブジェクトは物理にすべきです。
|caveats=*オブジェクトは物理属性にしてください。
*物体の質量中心に初期運動量を設定します。運動量とは、物体が他の力(重力など)の影響を受けていない場合に、最初の速度の動きを得るために必要な質量*速度のことです。
*運動量の[[llVecMag/ja|大きさ]]は、物体の利用可能なエネルギーによって縮小されます。重い物体の場合、運動量の上限は運動量=20000となります。(先に述べた20ではありません)速い物体の場合、速度の上限は202m/秒になります(したがって、運動量はこの上限を反映します)。
|examples=
|examples=
<lsl>
<source lang="lsl2">
//Rez an object, and drop this script in it.
//オブジェクトを rez して、スクリプトをその中に入れます。
//This will launch it at the owner.
//オーナーに向けて発射します。
default {
default
    state_entry() {
{
          list p = llGetObjectDetails(llGetOwner(), [OBJECT_POS]);
    state_entry()
          if(p != []) {
    {
              llSetStatus(STATUS_PHYSICS, TRUE);
        key ownerKey = llGetOwner();
              vector pos = llList2Vector(p, 0);
        vector ownerPosition = llList2Vector(llGetObjectDetails(ownerKey, [OBJECT_POS]), 0);
              vector direction = llVecNorm(pos - llGetPos());
              llApplyImpulse(direction * 100, 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);
    }
}
}
</lsl>
</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>
|helpers
|helpers
|also_functions=
|also_functions=
Line 34: Line 140:
|notes
|notes
|cat1=Physics
|cat1=Physics
|cat2
|cat2=Movement
|cat3
|cat3
|cat4
|cat4
}}
}}

Latest revision as of 20:41, 5 August 2021

要約

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

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

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

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

警告

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

サンプル

//オブジェクトを 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);
    }
}

自分でビール缶を作って、このスクリプトをそこに入れて、射撃の練習をしてみてください。

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);
    }
}
// 使えないスクリプト、ただのデモです。
// パラメーターは力ではなく勢いです。
// 他の力(衝突や重力)がない場合、初速度*質量=運動量となります。
// 運動量の上限は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>

関連項目

関数

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

特記事項

Search JIRA for related Issues

Signature

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