LlApplyImpulse/ja
< LlApplyImpulse
Jump to navigation
Jump to search
Revision as of 21:41, 5 August 2021 by Noriaji Resident (talk | contribs)
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
要約
関数: llApplyImpulse( vector force, integer local );警告
- オブジェクトは物理属性にしてください。
- 物体の質量中心に初期運動量を設定します。運動量とは、物体が他の力(重力など)の影響を受けていない場合に、最初の速度の動きを得るために必要な質量*速度のことです。
- 運動量の大きさは、物体の利用可能なエネルギーによって縮小されます。重い物体の場合、運動量の上限は運動量=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 | – | 持続的な力を設定します |
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。