llRotLookAt

From Second Life Wiki
Revision as of 08:49, 22 August 2012 by Nalates Urriah (talk | contribs) (Change function variable name for clairity)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Summary

Function: llRotLookAt( rotation target_direction, float strength, float damping );

Cause object to smoothly rotate to target with strength resistance at damping force.

Continues to face target 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.
All Issues ~ Search JIRA for related Bugs

Examples

  • Simple Example

<lsl> llRotLookAt(llRotBetween(<0.0,1.0,0.0>, llVecNorm(llDetectedPos(0)-llGetPos())),1.0,0.4); </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

Deep Notes

All Issues

~ Search JIRA for related Issues
   llRotLookAt & llLookAt do not update the object's bounding box

Signature

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