llRotLookAt

From Second Life Wiki
Revision as of 20:18, 22 August 2012 by Void Singer (talk | contribs) (~fixed link)
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.

Maintains rotation 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.
  • damping seems to be capped at 1.0; greater values are reduced to 1.0 (Tested 21 October 2010 on server version 10.10.18.212360)

Examples

Point the prim's positive y axis (<0.0, 1.0, 0.0>) towards a position on the sim

<lsl> //-- where vPosTarget is the global position of the object you want to "look" at llRotLookAt( llRotBetween( <0.0,1.0,0.0>, llVecNorm( vPosTarget - llGetPos() ) ), 1.0, 0.4 ); // Point +Y axis towards vPosTarget </lsl>

  • vPosTarget - llGetPos() converts the global coordinates of the objects, to a local distance and direction from the object pointing
  • Per llRotBetween article:
    • llRotBetween returns a scaled rotation, unless both inputs are equal magnitude (e.g. unit vector).
    • The use of llVecNorm reduces the magnitude to 1 (so that both are equal magnitude), preventing errors.

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 (rather than damped) rate of motion in a non-physical object try this

<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 llSetKeyframedMotion </lsl>

See Also

Deep Notes

Signature

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