Difference between revisions of "LlRot2Angle"

From Second Life Wiki
Jump to navigation Jump to search
m
m
Line 39: Line 39:
     if (s2 < v2) // compare the s-component to the v-component
     if (s2 < v2) // compare the s-component to the v-component
         return 2.0 * llAcos(llSqrt(s2 / (s2 + v2))); // use arccos if the v-component is dominant
         return 2.0 * llAcos(llSqrt(s2 / (s2 + v2))); // use arccos if the v-component is dominant
     else if (v2) // make sure the v-component is non-zero
     if (v2) // make sure the v-component is non-zero
         return 2.0 * llAsin(llSqrt(v2 / (s2 + v2))); // use arcsin if the s-component is dominant
         return 2.0 * llAsin(llSqrt(v2 / (s2 + v2))); // use arcsin if the s-component is dominant



Revision as of 09:37, 4 September 2012

Summary

Function: float llRot2Angle( rotation rot );
0.0 Forced Delay
10.0 Energy

Returns a float that is the rotation angle represented by rot

• rotation rot

Use in conjunction with llRot2Axis.
To undo use llAxisAngle2Rot.

Caveats

This always returns a positive angle <= PI radians, that is, it is the unsigned minimum angle. A rotation of 3/2 PI radians (270 degrees) will return an angle of PI / 2 radians, not -PI / 2.

Examples

See Also

Functions

•  llAxisAngle2Rot
•  llRot2Axis
•  llRot2Up
•  llRot2Fwd
•  llRot2Left
•  llAngleBetween Similar functionality.

Deep Notes

Reference Implementation

<lsl>float Rot2Angle(rotation a)//simple but turns out to not be very accurate. {

   return 2.0 * llAcos(llSqrt((a.s * a.s) / (a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s));

}</lsl>

<lsl>float Rot2Angle(rotation r)//more complex implementation but more accurate, and reasonably fast. {

   float s2 = r.s * r.s; // square of the s-element
   float v2 = r.x * r.x + r.y * r.y + r.z * r.z; // sum of the squares of the v-elements
   if (s2 < v2) // compare the s-component to the v-component
       return 2.0 * llAcos(llSqrt(s2 / (s2 + v2))); // use arccos if the v-component is dominant
   if (v2) // make sure the v-component is non-zero
       return 2.0 * llAsin(llSqrt(v2 / (s2 + v2))); // use arcsin if the s-component is dominant
   return 0.0; // argument is scaled too small to be meaningful, or it is a zero rotation, so return zero

}//Written by Moon Metty & Miranda Umino. Minor optimizations by Strife Onizuka</lsl>

Signature

function float llRot2Angle( rotation rot );