Difference between revisions of "LlVecDist"

From Second Life Wiki
Jump to: navigation, search
(Added some stuff to notes. Perhaps someone (Strife :D?) could make sure they're okay to add?)
Line 22: Line 22:
 
}
 
}
 
</lsl>
 
</lsl>
 
+
<lsl>
 +
//To reset script on touch if the object has been rotated since the last script reset
 +
float gTolerance = 0.05;  //This corresponds to about a 3 degree rotation
 +
default
 +
{
 +
state_entry()
 +
{
 +
llSetObjectDesc((string)llRot2Euler(llGetRot()));
 +
}
 +
 +
touch_start(integer total_number)
 +
{
 +
if (llVecDist(llRot2Euler(llGetRot()), (vector)llGetObjectDesc()) > gTolerance)
 +
{
 +
llSay(0,"This object has rotated. Automatic reset engaged.");
 +
llResetScript();
 +
}
 +
}
 +
}</lsl>
 
===Video Tutorial===
 
===Video Tutorial===
 
{{KBvideo|D0WvH58IWEo|640|385|type=youtube}}
 
{{KBvideo|D0WvH58IWEo|640|385|type=youtube}}

Revision as of 12:55, 16 October 2012

Summary

Function: float llVecDist( vector vec_a, vector vec_b );

Returns a float that is the undirected nonnegative distance between vec_a and vec_b.

• vector vec_a Any valid vector
• vector vec_b Any valid vector

Examples

<lsl> default {

   state_entry()
   {
       vector input_1 = <1.0,2.0,3.0>;
       vector input_2 = <3.0,2.0,1.0>;
       llOwnerSay("The distance between " + (string) input_1 +
           " and " + (string) input_2 + " is: "+(string)llVecDist(input_1, input_2) );
   }

} </lsl> <lsl> //To reset script on touch if the object has been rotated since the last script reset float gTolerance = 0.05; //This corresponds to about a 3 degree rotation default { state_entry() { llSetObjectDesc((string)llRot2Euler(llGetRot())); }

touch_start(integer total_number) { if (llVecDist(llRot2Euler(llGetRot()), (vector)llGetObjectDesc()) > gTolerance) { llSay(0,"This object has rotated. Automatic reset engaged."); llResetScript(); } } }</lsl>

Video Tutorial

Notes

  • Mathematically equivalent to:
    • llVecMag( vec_a - vec_b )
    • llSqrt( (vec_b.x - vec_a.x) * (vec_b.x - vec_a.x) + (vec_b.y - vec_a.y) * (vec_b.y - vec_a.y) + (vec_b.z - vec_a.z) * (vec_b.z - vec_a.z) )
  • Knowing this, there are ways to circumvent llVecDist for more efficient code.
    • For example, vector v3 = (v1-v2); v3*v3 < (f*f); is over twice as fast as llVecDist(v1,v2) < f;

See Also

Functions

•  llVecMag
•  llVecNorm

Deep Notes

Search JIRA for related Issues

Signature

function float llVecDist( vector vec_a, vector vec_b );