llRot2Euler

From Second Life Wiki
Jump to navigation Jump to search

Summary

Function: vector llRot2Euler( rotation quat );
0.0 Forced Delay
10.0 Energy

Returns a vector that is the Euler representation (roll, pitch, yaw) of quat, with each component expressed in radians.

• rotation quat Any valid rotation

Specification

The Euler angle vector (in radians) is converted from a rotation by doing the rotations around the 3 axes in Z, Y, X order.

Caveats

  • Angles greater than PI radians (180 degrees) are returned as negative angles.

Examples

<syntaxhighlight lang="lsl2"> default {

   state_entry()
   {
       rotation input = llGetRot();
       llSay(0, "The Rot2Euler of " + (string)input + " is: " + (string) llRot2Euler(input) );
   }

} </syntaxhighlight>

<syntaxhighlight lang="lsl2"> // This script rotates a prim by 15 degrees each time the prim is touched

// While not the best way of achieving the result, // this script demonstrates the use of llRot2Euler and llEuler2Rot // and the use of more human-friendly degrees rather than radians

default {

   touch_start(integer total_number)
   {
       // Get the object's current rotation as a quarternion
       rotation rot = llGetRot();
       // Convert the rotation to a euler with roll, pitch, and yaw in radians
       vector euler = llRot2Euler(rot);
       // convert the angles from radians to degrees
       euler *= RAD_TO_DEG;
       // Add 15 degrees on the Z axis        
       euler += <0, 0, 15>;
       // Say the current euler values in degrees
       llSay(0, (string) euler);         
       // convert degrees back to radians
       euler *= DEG_TO_RAD;
       // Convert the euler back to a rotation quarternion
       rot =  llEuler2Rot (euler);
       // Apply the updated rotation to the prim   
       llSetRot( rot ); 
   }

}

</syntaxhighlight>

See Also

Functions

•  llEuler2Rot

Articles

•  "Wikipedia logo"Euler Angles

Deep Notes

Reference Implementation

<syntaxhighlight lang="lsl2"> vector uRot2Euler(rotation rot) {

       vector ret;
       vector temp;
       //x-axis
       temp = <0,0,1>*rot;
       ret.x = llAtan2(temp.z,temp.y)-PI/2;
       rot = rot/llEuler2Rot(<ret.x,0,0>);
       //y-axis
       temp = <0,0,1>*rot;
       ret.y = -llAtan2(temp.z,temp.x)+PI/2;
       rot = rot/llEuler2Rot(<0,ret.y,0>);
       //z-axis
       temp = <1,0,0>*rot;
       ret.z = llAtan2(temp.y,temp.x);
       return ret;

} </syntaxhighlight>

Signature

function vector llRot2Euler( rotation quat );