llRotLookAt

From Second Life Wiki
Revision as of 15:38, 22 August 2012 by Nalates Urriah (talk | contribs) (Add llSetPhysicsMaterial to ALSO)
Jump to navigation Jump to search

Summary

Function: llRotLookAt( rotation target_direction, float strength, float damping );
0.0 Forced Delay
10.0 Energy

Causes an object to smoothly rotate to target_direction with strength resistance at damping force.

Continues to turn or hold the physical object to face target_direction until stopped with llStopLookAt.

• rotation target_direction
• float strength
• float damping seconds to critically damp in

To change the position in the same manner use llMoveToTarget. For physical objects a range between .2 and 1 is good for both parameters.

Caveats

  • In Non-Physical objects this function operates effectively the same as llSetLocalRot.

Examples

  • Simple Example - point the prim's positive y axis towards a position on the sim

<lsl> llRotLookAt(llRotBetween(<0.0,1.0,0.0>, llVecNorm(llDetectedPos(0)-llGetPos())),1.0,0.4); // Point Y in target_direction </lsl> Void Singer explains: llRotBetween returns a scaled rotation, so if one term is a unit vector, it works out better if both are, hence the use of llVecNorm

The code llDetectedPos(0)-llGetPos() is used to convert from global position to a local position.

  • Constraining the Rotation to One Axis

<lsl>

     vector detected = llDetectedPos(0);
     vector pos = llGetPos();
     llRotLookAt(llRotBetween(<0.0,1.0,0.0>, llVecNorm(<detected.x,detected.y,pos.z>-pos)),1.0,0.4);
</lsl>

Useful Snippets

  • If you want a (mostly) smooth constant rate of motion in a non-physical object try this instead

<lsl> //-- Rotates Object to vRotTarget at vFltRate (in radians per second //-- vFltRate < ~0.00000003rad/sec, (~0.00002deg/sec) will result in errors (and is just too slow anyway) //-- vFltRate >= (PI * 5.0)rad/sec, (900deg/sec) will result in a single snap move to vRotTarget uSteppedRotLookAt( rotation vRotTarget, float vFltRate){ if ((integer)(vFltRate = (llAngleBetween( llGetLocalRot(), vRotTarget ) / (vFltRate / 5.0)))){ rotation vRotStep = llAxisAngle2Rot( llRot2Axis( vRotTarget / llGetLocalRot() ), (1.0 / vFltRate) * llRot2Angle( vRotTarget / llGetLocalRot() ) ); vFltRate = (integer)vFltRate; do{ llSetLocalRot( vRotStep * llGetLocalRot() ); }while( --vFltRate ); } llSetLocalRot( vRotTarget ); } //-- for fixed time on any rotation try llKeyframeMotion </lsl>

Notes

  • For physical objects, damping seems to be limited at 1.0; setting it to greater value has the same effect as if it was 1. Tested 21 October 2010 on server version 10.10.18.212360.

See Also

Functions

•  llLookAt
•  llStopLookAt
•  llSetPhysicsMaterial

Deep Notes

Signature

function void llRotLookAt( rotation target_direction, float strength, float damping );