User:Lum Pfohl/LSL Goodies/LoopRez v0.6 Lum Mods

From Second Life Wiki
< User:Lum Pfohl‎ | LSL Goodies
Revision as of 07:39, 3 February 2008 by Strife Onizuka (talk | contribs) (cleaned up the math)
Jump to navigation Jump to search

LoopRez v0.6 Lum Mods

This is a posting of Ged Larsen's LoopRez v0.6 script. I have modified it slightly so that it automatically rezzes a root prim of the correct orientation. <lsl>//////////////////////////////////////////////////////////////////////////////// // LoopRez v0.6, by Ged Larsen, 20 December 2006 // Strife Onizuka was here in 2008 // // - rez a number of objects in an ellipse, whose size is determined by xRadius and yRadius // - all facing "outwards", along a tangent to the ellipse // - can set how much the objects flare outwards // - properly handles object rotation corrections (for example, X-axis 180 degree rotation helps for flexi-prim skirts) // - can also get a 'saddle' bend, to generate a bend that might help for necklaces (from Ariane Brodie) // // To use: // 1) create a prim that will contain this script and the object to use // 2) put the script into the prim // 3) create an object that will be used, and name it "Object" // 4) put "Object" into the prim containing the script, by dragging it from your inventory // 5) get out of Edit Mode, and touch the prim // // Random note: // - this version does NOT insure equal spacing of objects along the perimeter of the ellipse // - i.e., objects "bunch up" at the long ends of an ellipse; the effect should be acceptable for non-extreme ellipses // - even spacing of objects can be accomplished, but requires simulation of integral calculus, which slows down the script // // References: // - tangent formulas from: http://mathworld.wolfram.com/Ellipse.html


//////////////////////////////////////////////////////////////////////////////// // CONFIGURATION PARAMETERS, change these to your liking

string objectName = "My Skirt Prim"; // object to use; will need to be in the inventory of the prim containing this script string rootPrimName = "Root Prim (Rename Me)"; // root prim that will appear at center of dress integer numObjects = 16 ; // how many objects float xRadius = .72; // ellipse x-axis radius in meters float yRadius = .72; // ellipse y-axis radius in meters float flareAngle = 70.0; // how many DEGREES the bottom of object will flare outwards, the "poof" factor float bendCoefficient = 0.0; // makes a "saddle shape", bends DOWN this number of meters at extremes of X-axis vector rotOffset = <0.0, 180.0, 0.0>; // rotation offset in DEGREES -- fixes the rotation of ALL objects; for flexi prims, often you will want <180.0, 0.0, 0.0> vector posOffset = <0.0, 0.0, 1.0>; // position offset


//////////////////////////////////////////////////////////////////////////////// // No need to mess with anything below here

makeLoop() {

   integer n = 0;                      // which object is being placed
   float cos;                          // cosine of the angle
   float sin;                          // sine of the angle
   vector pos;                         // position
   rotation rot;                       // rotation in quaternion format
   vector rezzerPos = llGetPos();
   vector rootPrimPos = rezzerPos + posOffset + <0.0, 0.0, 0.5>;
   float s = TWO_PI / numObjects;
   for(; n < numObjects; ++n) {
       cos = llCos(s * n);
       sin = llSin(s * n);
       //x = ellipse: 2x xRadius meters wide
       //y = ellipse: 2x yRadius meters wide
       //z = saddle shape, bending downwards on X-axis
       pos = <xRadius * cos, yRadius * sin, -bendCoefficient * cos * cos> + 
             rezzerPos + 
             posOffset; 
       // user-chosen rotation offset correction
       // flare generation (poof)
       // the following make the objects face outwards properly for an ellipse; using theta alone is only correct for a circle
       rot = llEuler2Rot(rotOffset * DEG_TO_RAD) * 
             llEuler2Rot(<0, -flareAngle * DEG_TO_RAD, 0>) * 
             llRotBetween(<1.0,0.0,0.0>, <yRadius * cos, xRadius * sin, 0.0>);
       llRezObject(objectName, pos, ZERO_VECTOR, rot, n);
   }
   
   // My dresses always use a root prim at the center of the circle/ellipse.
   // Rather than copying the rezzer, deleting objects and scripts inside and renaming it, I
   // am going to rez a root prim specifically designed for this purpose, at or around the corect
   // height, centered in the skirt.  
   llRezObject(rootPrimName, rootPrimPos, ZERO_VECTOR, ZERO_ROTATION, 0);

}

default {

   touch_start(integer total_number)
   {
       if (llDetectedOwner(0) == llGetOwner())
       {
           makeLoop();
       }
   }

}</lsl>

Lum Pfohl 20:23, 13 December 2007 (PST)

Lum's Quick Links
LumSelfPortrait.jpg
Click to Enlarge


Related topics

edit