llAngleBetween
float llAngleBetween(rotation Rot1, rotation Rot2)Returns the angle, in radians, between rotations Rot1 and Rot2.
Parameters
-
Rot1(rotation) - First rotation.
-
Rot2(rotation) - Second rotation.
default{ touch_start(integer num_detected) { rotation currentRootRotation = llGetRootRotation(); float angle = llAngleBetween(ZERO_ROTATION, currentRootRotation);
// PUBLIC_CHANNEL has the integer value 0 llSay(PUBLIC_CHANNEL, "llAngleBetween(ZERO_ROTATION, " + (string)currentRootRotation + ") = " + (string)angle); }}Reference Implementations
Section titled “Reference Implementations”The function calculates the angle between two rotations using quaternion math. Here are two common implementations:
Simple implementation (less accurate):
float AngleBetween(rotation a, rotation b){ return 2.0 * llAcos(llFabs(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) / llSqrt((a.x * a.x + a.y * a.y + a.z * a.z + a.s * a.s) * (b.x * b.x + b.y * b.y + b.z * b.z + b.s * b.s)));}More accurate implementation (written by Moon Metty & Miranda Umino, with optimizations by Strife Onizuka):
float AngleBetween(rotation a, rotation b){ rotation r = b / a; // calculate the rotation between the two arguments as quaternion 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; // one or both arguments are scaled too small to be meaningful, or the values are the same, so return zero}- The function returns the angle in radians between two rotations
- Be aware that accuracy can vary depending on the implementation; the more complex implementation is generally more accurate and reasonably fast
See Also
Section titled “See Also”- llRotBetween - Calculate rotation between two vectors
- llRot2Angle - Extract angle from an axis-angle rotation representation