LlApplyImpulse

来自人工智能助力教育知识百科
Wzc讨论 | 贡献2020年5月18日 (一) 09:00的版本 (创建页面,内容为“{{LSL Header|ml=*}}{{LSLC|Keywords}}{{LSLC|Flow Control}}{{LSLC|}} {{函数详情 |函数名=Function: llApplyImpulse( vector momentum, integer local ); |参数=…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Template:Needs Translation/


函数名
Function: llApplyImpulse( vector momentum, integer local );
引用对对象应用脉冲
•矢量动量

•整数局部-布尔值,如果真动量被视为局部方向向量,如果假动量被视为区域方向向量 瞬间冲动。llSetForce具有连续推送。”“瞬时”似乎意味着一秒钟的冲量,因为一个力(牛顿)的作用等于物体的质量(千克)持续一秒钟会使其加速到1的速度(米每秒),这似乎就是这个函数所发生的情况。

注意事项
只适用于支持物理的对象。

设置应用于质心的对象上的初始动量。动量是当物体不受其他力(如重力)影响时,获得初始速度运动所需的质量*速度 动量的大小可以被物体的可用能量缩小。对于重物体,动量的上限为动量=20000。(而不是之前所说的20)。对于快速物体,速度将被限制在202米/秒(因此动量将反映这个上限)

示例
//  Rez an object, and drop this script in it.
//  This will launch it at the owner.
 
default
{
    state_entry()
    {
        key ownerKey = llGetOwner();
        vector ownerPosition = llList2Vector(llGetObjectDetails(ownerKey, [OBJECT_POS]), 0);
 
//  if the owner is not in the sim, stop fooling around
        if (llGetAgentSize(ownerKey) == ZERO_VECTOR)
            return;
 
//  else
        llSetStatus(STATUS_PHYSICS, TRUE);
 
        vector objectPosition = llGetPos();
        vector direction = llVecNorm(ownerPosition - objectPosition);
 
        llApplyImpulse(direction * 100, 0);
    }
}
Make yourself a beer can, drop this script into it, and have some target practice.

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);  // Send the can home, even if more than 10m away
        llSetRot(ZERO_ROTATION);
        llSetTimerEvent(0.0);
    }
}
// Uselesse script , just to demo that 
// the parameter is a momentum not a force
// the initial velocity * mass = momentum when there are no other forces ( collisions, gravity )
// the momentum is not capped to 20
// momentum may be capped nevertheless because velocity is capped around 200 meters/second ; in this case it will be capped to 200m/s * mass
 
 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–设置连续力

相关事件
不可预测性

取自模拟器用户组/抄本/2012年10月5日 [16:24]Andrew Linden:llApplyImpulse()更不可预测 [16:24]安德鲁·林登:因为它使用了传统的脚本“能源预算” [16:25]Andrew Linden:如果脚本对象没有足够的“能量”来执行它想要的脉冲,这将减弱结果 [16:25]Andrew Linden:而且,llApplyImpulse()有很大的扭曲潜力 [16:25]Andrew Linden:所以我们很早以前就以很高的能耗率阻碍了它的发展