LScript (Modeler) to create skelegons based on the normals at point locations.
Compatible with Newtek LightWave 9.6 and above.
// LScript Modeler - www.StephenCulley.co.uk // // web address: http://www.stephenculley.co.uk // email address: email@stephenculley.co.uk /* LScript Modeler - Point Normal To Skelegon Modeler_PointNormalToSkelegon.ls */ @version 2.2 @warnings @script modeler @name *Point Normal To Skelegon // Title sTitle = "*Point Normal To Skelegon"; // Version sVersion = "v1.0"; // Variable aSelectedPoints = nil; ctrl_c0; main { // Store nSize = recall("nSize",0.1); reqbegin(sTitle + " " + sVersion); // Reset ctrl_res0 = ctlbutton("Reset",50,"button_reset"); // Button Reset ctlsep(); // Control ctrl_c0 = ctldistance("Size",nSize); // Developer ctlsep(); ctrl_dev0 = ctltext("","developer: Stephen Culley","http://www.stephenculley.co.uk"); return if !reqpost(); nSize = getvalue(ctrl_c0); // Store store("nSize",nSize); // Selection - Point (DIRECT) selmode(DIRECT); iPointCount = pointcount(); if(iPointCount < 1) error("None or not enough points selected."); editbegin(); aSelectedPoints = points; // Store points for later use foreach(iSelectedPoint,aSelectedPoints) { aPolygons = nil; aPolygons = iSelectedPoint.polygon(); // Error if(aPolygons == nil) error("Points must be connected to polygons."); foreach(iPolygons,aPolygons) { aPoints = nil; aPoints = polyinfo(iPolygons); // Error if(sizeof(aPoints) < 4) error("Polygons need a minimum of 3 points."); } } editend(); undogroupbegin(); // Undo moninit(iPointCount,"Processing..."); // Progress Monitor foreach(iSelectedPoint,aSelectedPoints) { // Selection - Point (GLOBAL) selmode(GLOBAL); editbegin(); vNorm = pointnormal(iSelectedPoint); i1 = addpoint(pointinfo(iSelectedPoint)); // Returns ID i2 = addpoint(vNorm * nSize + pointinfo(iSelectedPoint)); // Returns ID aNormalPolygon[1] = i1; aNormalPolygon[2] = i2; iPolygon = addpolygon(aNormalPolygon); editend(); // Selection - Polygon (USER) selmode(USER); selpolygon(CLEAR); selpolygon(SET,POLYID,iPolygon); cmdseq("MakeSkelegons"); delete(); monstep(); // Progress Monitor } undogroupend(); // Undo info(iPointCount," skelegon(s) added."); } button_reset { setvalue(ctrl_c0,0.1); // Size } pointnormal: point // v { v = <0.0,0.0,0.0>; aPolygons = point.polygon(); iPolygonCount = size(aPolygons); for(p = 1; p <= iPolygonCount; p++) { v += polynormal(aPolygons[p]); } v /= iPolygonCount; return(normalize3D(v)); } // INTERPOLATION linear1D: n1,n2,i // i = interpolation point (0-1) { return(n1 * (1 - i) + n2 * i); } // VECTOR 3D crossproduct3D: v1,v2 // v { // Vector return(); } distance3D: v1, v2 // n { // Vector return(sqrt(((v2.x - v1.x) * (v2.x - v1.x)) + ((v2.y - v1.y) * (v2.y - v1.y)) + ((v2.z - v1.z) * (v2.z - v1.z)))); } magnitude3D: v // n { // Vector return(sqrt((v.x * v.x) + (v.y * v.y) + (v.z * v.z))); } normalize3D: v // v { // Vector normalize to 0 - 1 nMagnitude = magnitude3D(v); if(nMagnitude <> 0) nMagnitude = 1 / nMagnitude; return(v * nMagnitude); }
All scripts available at my Google Drive at
https://drive.google.com/open?id=1cR_q2GVUAJHumic1-A3eXV16acQnVTWs