Difference between revisions of "LlRotBetween"

From Second Life Wiki
Jump to navigation Jump to search
Line 23: Line 23:
|notes=
|notes=
This function adjusts the magnitude of the quaternion so <code>start * llRotBetween(start, end) == end</code> is true as long as neither have a magnitude of zero. They don't have to have the same magnitude.  
This function adjusts the magnitude of the quaternion so <code>start * llRotBetween(start, end) == end</code> is true as long as neither have a magnitude of zero. They don't have to have the same magnitude.  
<pre>
<lsl>rotation RotBetween(vector start, vector end) //adjusts quaternion magnitude so (start * return == end)  
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.
{//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);
     rotation rot = llRotBetween(start, end);
Line 32: Line 31:
         {
         {
             float d = llSqrt(llVecMag(end) / llVecMag(start));
             float d = llSqrt(llVecMag(end) / llVecMag(start));
             return <rot .x * d, rot .y * d, rot .z * d, rot .s * d>;
             return <rot.x * d, rot.y * d, rot.z * d, rot.s * d>;
         }
         }
     }
     }
     return rot;
     return rot;
}//Strife Onizuka
}//Strife Onizuka</lsl>
</pre>
|deprecated
|deprecated
|cat1=Math/3D
|cat1=Math/3D

Revision as of 17:38, 6 March 2008

Summary

Function: rotation llRotBetween( vector start, vector end );
0.0 Forced Delay
10.0 Energy

Returns a rotation that is the 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) == end is only true if start and end have the same magnitude and neither have a magnitude of zero (see #Notes for a workaround).

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.

Notes

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. <lsl>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</lsl>

See Also

Functions

•  llAngleBetween

Deep Notes

Signature

function rotation llRotBetween( vector start, vector end );