Skip to content
lsl.devlsl.devLSL Dev

llLookAt

function
Function syntax
llLookAt(
  1. vector target,// Target position vector in region coordinates to look at.
  2. float strength,// Force of rotation (0.0 cancels the tracking; values around half the object's mass are typical).
  3. float damping// Timescale in seconds to critically damp the orientation.
);
Energy
10

Cause object to point its up axis (positive z) towards target, while keeping its forward axis (positive x) below the horizon.

Continues to track target until llStopLookAt is called.

To change the position in the same manner use llMoveToTarget.

How to use
llLookAt(ZERO_VECTOR, 0.0, 0.0);

Strength is an inverse value meaning lower values cause the object to turn faster. Damping smooths the objects movements out preventing jitter or sharp movements. Object size, mass, and shape do not effect the function other than a large physical object that is resting on or colliding with other objects might not be able to turn correctly or fully.

  • Object must be physical or this will do nothing.
  • If the prim is not the root, then target will need correction for the root prim’s rotation (see example below).
  • If the object is an attachment, then target will need correction for the wearer’s rotation.
  • Low strength values paired with low damping can cause the object to wobble and never fully face the target.
Example 1
//Causes Object to look at nearest Avatar.
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 20.0, PI, 0.2);
}
sensor(integer total_number)
{
llLookAt( llDetectedPos(0) + <0.0, 0.0, 1.0>, 3.0, 1.0 );
}
}
Example 2
11 collapsed lines
// Same as above, but for use inside a child prim or the root of an attachment.
// Make the child or attachment look at nearest Avatar.
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 20.0, PI, 0.2);
}
sensor(integer total_number)
{
vector p = llGetPos();
llLookAt(p + (llDetectedPos(0) + <0.0, 0.0, 1.0> - p) / llGetRootRotation(), 3.0, 1.0);
}
}
  • If you want a (mostly) smooth, one time, constant rate of motion, (using the x axis) in a non-physical object try this instead…
//-- rotate objects x axis toward vPosTarget (local offset), 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
uSteppedLookAt( vector vPosTarget, float vFltRate ){
rotation vRotTarget = llRotBetween( <1.0, 0.0, 0.0>, vPosTarget );
if ((integer)(vFltRate = llAcos( (vPosTarget = llVecNorm( vPosTarget )) *
(<1.0, 0.0, 0.0> * llGetLocalRot()) ) / (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
  • If you want to use the LookAt function on a linked object…
LinkedLookAt( vector Target){
rotation rotvec = llRotBetween(<0,1,0>,llVecNorm((Target - llGetPos())));
rotation rotbet = rotvec/llGetRootRotation();
llSetRot(rotbet);
}
default
{
state_entry()
{
llSensorRepeat("", "", AGENT, 20.0, PI, 1.0);
}
sensor(integer total_number)
{
vector p = llDetectedPos(0);
LinkedLookAt(p);
}
}

From the issue templates included by the wiki article:

  • SVC-1903: type=bug|llRotLookAt & llLookAt do not update the object’s bounding box
Original wiki source

Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.