LlRotBetween
From Second Life Wiki
| LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Tutorials |
Contents |
Summary
Function: rotation llRotBetween( vector start, vector end );| 21 | Function ID |
| 0.0 | Delay |
| 10.0 | Energy |
Returns a rotation that is the shortest rotation between the direction start and the direction end
| • vector | start | |||
| • vector | end |
Specification
start and end are directions and are relative to the origin <0.0, 0.0, 0.0>. If you have coordinates relative to a different origin, subtract that origin from the input vectors.
Caveats
start * llRotBetween(start, end) == endis only true if start and end have the same magnitude and neither have a magnitude of zero (see #Useful Snippets for a workaround).- This of course is ignoring floating point precision errors.
- Rotations are from -PI to +PI around each axis.
Important Issues
~ Search JIRA for related Bugs| | | SVC-4415 | [c] | llRotBetween sometimes gives erroneous results. |
Examples
llRotBetween(<1.0, 0.0, 0.0>, <0.0, -1.0, 0.0>) // will return <0.00000, 0.00000, -0.70711, 0.70711> (which represents -45 degrees on the z axis) llRotBetween(<0.0, 0.0, 0.0>, <0.0, -1.0, 0.0>) // will return <0.00000, 0.00000, 0.00000, 1.00000> (which represents a zero angle on all axis) // because <0.0, 0.0, 0.0> does not convey a direction.
Useful Snippets
This function adjusts the magnitude of the quaternion so start * llRotBetween(start, end) == end is true as long as neither have a magnitude of zero. They don't have to have the same magnitude.
rotation RotBetween(vector start, vector end) //adjusts quaternion magnitude so (start * return == end) {//Authors note: I have never had a use for this but it's good to know how to do it if I did. rotation rot = llRotBetween(start, end); if(start) { if(end) { float d = llSqrt(llVecMag(end) / llVecMag(start)); return <rot.x * d, rot.y * d, rot.z * d, rot.s * d>; } } return rot; }//Strife Onizuka
Notes
Vectors that are near opposite each other in direction may lead to erroneous results.
// First Vector is due north second vector is ALMOST due south. rotation lRotation = llRotBetween( <0., 1., 0.>, <-0.001, -.1, 0.> ); llSay(0, lRotation ); // Provides a result of <1.00000, 0.00000, 0.00000, 0.00000>.
Deep Notes
//Loosely based on SL source code rotation llRotBetween(vector start, vector end) { vector v1 = llVecNorm(start); vector v2 = llVecNorm(end); float dot = v1 * v2; vector axis = v1 % v2; if (dot < -0.9999999) { // 180 degrees or there abouts vector ortho_axis = llVecNorm(<1.f, 0.f, 0.f> - (sn * (sn.x / (sn * sn)))); if (ortho_axis) return < ortho_axis.x, ortho_axis.y, ortho_axis.z, 0.f>; return <0.0, 0.0, 1.0, 0.0>; } else if(dot > 0.9999999) { //parallel return ZERO_ROTATION; } dot = dot + 1.0; float m = 1 / llSqrt((axis * axis) + (dot * dot)); return <axis.x * m, axis.y * m, axis.z * m, dot * m>; }
Issues
~ Search JIRA for related Issues| | | SVC-4415 | [c] | llRotBetween sometimes gives erroneous results. |
Source
This article wasn't helpful for you? Maybe the related article at the LSL Wiki is able to bring enlightenment.

