Skip to content

llSetRot

void llSetRot(rotation Rotation)

If the object is not physical, this function sets the rotation of the prim.

If the script is in a child prim, Rotation is treated as root relative and the link-set is adjusted.

If the prim is the root prim, the entire object is rotated to Rotation in the global reference frame.

Parameters
Rotation (rotation)
  • If the prim is attached, then this function offsets the rotation by the avatar’s rotation.
  • If the prim is not the root prim it is offset by the root’s rotation.
    • If you are trying to set the rotation of a child prim relative to the root prim then divide the rotation by the root rotation.
    • If you are trying to set the rotation of a child prim to a global rotation then you need to divide the global rotation by the root rotation twice.
    • It is better to use llSetLocalRot to set the rotation of child prims, even if you are setting it to a global rotation (just divide by the root rotation in that case).
    • Alternatively see the Useful Snippets section below for generalized workarounds that work with llSetPrimitiveParams, llSetLinkPrimitiveParams, and llSetLinkPrimitiveParamsFast.
  • For small rotation changes, there is an update threshold depending on the time duration between changes. It does not appear to be limited to the 6deg rule any longer.
  • For static objects (type of pathfinding), the script fails with the error in debug channel: “Unable to set prim rotation: object contributes to the navmesh.”

Drop this script in the root prim of an object to have it rotate in 1 degree increments. Note that it won’t work on child prims if the root is rotated.

rotation rot_xyzq;
default
{
state_entry()
{
vector xyz_angles = <0,1.0,0>; // This is to define a 1 degree change
vector angles_in_radians = xyz_angles*DEG_TO_RAD; // Change to Radians
rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation
}
touch_start(integer s)
{
llSetRot(llGetRot()*rot_xyzq); //Do the Rotation...
}
}

Drop this one in a child prim to have it rotate around the world’s Y axis in 1 degree increments. It won’t work in the root if it is rotated.

rotation rot_xyzq;
default
{
state_entry()
{
vector xyz_angles = <0,1.0,0>; // This is to define a 1 degree change
vector angles_in_radians = xyz_angles*DEG_TO_RAD; // Change to Radians
rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation
}
touch_start(integer s)
{
llSetRot(llGetRot()*rot_xyzq/llGetRootRotation()/llGetRootRotation()); //Do the Rotation...
}
}

These correctly set a global rotation for the root prim in all scenarios:

llSetLocalRot( rot )
llSetPrimitiveParams( [PRIM_ROT_LOCAL, rot] )

These correctly set a global rotation for a child prim in all scenarios:

llSetLocalRot( rot / llGetRootRotation() )
llSetPrimitiveParams( [PRIM_ROT_LOCAL, rot / llGetRootRotation() ] )