Hi Fabrice,

I dug through the PathExtrude class because I was really curious, and
I noticed the scales were being applied after the projected points
were calculated. As a test I duplicated the class and played around
with it. I added a new profileScales prop that works just like scales,
except it applies to the _points array on line #348 before the major
calculations.

Instead of:

atmp = atmp.concat(_points);

I did:

atmp = pRescale ? _smoothscale ? atmp.concat(PathUtils.scalePoints
(_points, aPScales[j])) : atmp.concat(PathUtils.scalePoints(_points,
lastscale)) : atmp.concat(_points);


I make no claims to even begin to understand the complex math
performed in your class, but scaling the extrude this way doesn't
interrupt the original path. I uploaded a test using the modified
class:
http://sibhod.com/away3d/scaleTest3.swf

and I uploaded the class file here:

http://sibhod.com/away3d/PathScaleExtrude.as

On Feb 7, 3:55 pm, sibhod <[email protected]> wrote:
> I did try your code, but if a path point is on 0 there's no value for
> scales to multiply. I made an example. I tried only scaling the z
> value like you said:
>
> var scales:Array = new Array(
> new Number3D(1, 1, 4),
> new Number3D(1, 1, 3.6),
> new Number3D(1, 1, 3.2),
> new Number3D(1, 1, 2.8),
> new Number3D(1, 1, 2.4),
> new Number3D(1, 1, 2),
> new Number3D(1, 1, 1.6),
> new Number3D(1, 1, 1.4),
> new Number3D(1, 1, 1.2),
> new Number3D(1, 1, 1.1),
> new Number3D(1, 1, 1))
>
> I created two paths, both only moving along the x axis, but one is
> offset y and z by 100:
>
> var extrudePath:Path = new Path([
> new Number3D(-250, 100, 100), null, new Number3D(-200,100, 100),
> null, null, new Number3D(-150, 100, 100),
> null, null, new Number3D(-100, 100, 100),
> null, null, new Number3D(-50, 100, 100),
> null, null, new Number3D(0, 100, 100),
> null, null, new Number3D(50, 100, 100),
> null, null, new Number3D(100, 100, 100),
> null, null, new Number3D(150, 100, 100),
> null, null, new Number3D(200, 100, 100),
> null, null, new Number3D(250, 100, 100)
> ]);
> extrudePath.smoothPath()
> extrudePath.worldAxis = new Number3D(0,0,1);
>
> var extrudePath2:Path = new Path([
> new Number3D(-250, 0, 0), null, new Number3D(-200,0, 0),
> null, null, new Number3D(-150, 0, 0),
> null, null, new Number3D(-100, 0, 0),
> null, null, new Number3D(-50, 0, 0),
> null, null, new Number3D(0, 0, 0),
> null, null, new Number3D(50, 0, 0),
> null, null, new Number3D(100, 0, 0),
> null, null, new Number3D(150, 0, 0),
> null, null, new Number3D(200, 0, 0),
> null, null, new Number3D(250, 0, 0)
> ]);
> extrudePath2.smoothPath()
> extrudePath2.worldAxis = new Number3D(0,0,1);
>
> I created two extrudes from these paths with the same profile, scale,
> and ini values. The end result is this:http://sibhod.com/away3d/scaleTest2.swf
>
> It seems to work fine if you only scale a point's dimension that's on
> 0. How do I make it only scale the profile?
>
> On Feb 6, 7:29 pm, Fabrice <[email protected]> wrote:
>
> > yes makes sens, again, smoothscale:true
> > and pass per segment a Number3d in the array
> > it should look like this (1,1,1), (1,1, 1.2), (1,1, 1.4) etc.. one per  
> > segment
> > if aligntopath is true and your path is valid, you should be able to  
> > build that shape
>
> > Declare the profile only using x,y values and let all z to 0 to make  
> > it work without having to edit the orientation vector.
> > (Pathextrude.worldaxis)
> > the profile must also distributed on the x and y axis  like -10/10. if  
> > not, you'll end with an offset, the profile would not be centered  
> > along the Path.
>
> > Did you run the code I've gave you?
> > because if you pass a circular shape, and edit the path info you'll  
> > get that shape.
>
> > Fabrice
>
> > On Feb 6, 2009, at 11:12 PM, sibhod wrote:
>
> > > Ok, so scales do not work how I was thinking.
>
> > > Maybe I should just explain what I am attempting. I would like to be
> > > able to draw a curvy path in 3d, and have a profile extrude and taper
> > > along the path without modifying the path positions. I attempted to
> > > divide each path point's position by it's scale value to offset the
> > > scale multiplication, and I ended up with a sloppy looking extrude:
>
> > >http://sibhod.com/away3d/scalesTestInvert.swf
>
> > > I created a quick visual of what I am attempting with a cylinder and
> > > modifiers here:
>
> > >http://sibhod.com/away3d/taperExample.swf
>
> > > I would like to be able to keep the extrude path the same, while
> > > scaling only the extruded profile. Does that make sense?
>
> > > Thanks Fabrice!
>
> > > On Feb 6, 1:01 pm, Fabrice <[email protected]> wrote:
> > >> Hey Sibhod,
> > >> yes, you do wrong :)
>
> > >> The scale Number3D's are multipliers, when smoothscale is true their
> > >> respective values are interpolated on a linear way. They are applied
> > >> on the transformed vertexes.
> > >> if you mulitply by zero a vector property, chances are high you will
> > >> have some vertexes going wild in the final piece. If you want they
> > >> remain unchanged it must be (1,1,1).
> > >> This is also the default set when you do not pass a scales array.
>
> > >> Look at previous example. only the z factor were changed. this  
> > >> depends
> > >> on the way you define the profile and how the shape is projected to
> > >> the path in case of aligntopath:true.
> > >> in this case it is using the xy plan for the profile. Try my code and
> > >> pass for a second one null, you will see they will have exact same
> > >> length.
>
> > >> A quick tip: just pass (1,1,1) and on the second or third
> > >> CurveSegment, pas (1,1,3) , if its affecting the position, try  
> > >> (1,3,1);
> > >> in your case you affect the 3 axes. Witch is from what you explain,
> > >> not what you want.
>
> > >> In case you are using different projection or path definitions, try
> > >> set the PathExtrude.worldaxis property. the default is 0,1,0, try
> > >> 0,0,1 instead.
>
> > >> Fabrice
>
> > >> On Feb 6, 2009, at 7:38 PM, sibhod wrote:
>
> > >>> Hey Frabrice,
>
> > >>> I updated from the svn, but unless I'm doing something wrong it's
> > >>> still not quite fixed. If you do a scale from a (0,0,0) point then
> > >>> scales can't affect the position.
> > >>> Here's a quick example I made to try and highlight the issue better:
>
> > >>>http://sibhod.com/away3d/scalesTest.swf
>
> > >>> These are two identical pathExtrudes, except the y positions are
> > >>> inverted. The top extrude is constructed with 'null' for the scales
> > >>> arg, and the bottom extrude has a scales array graduating from (2,  
> > >>> 2,
> > >>> 2) to (1, 1, 1). This isn't how it's supposed to work, right?
>
> > >>> Thanks!
>
> > >>> On Jan 29, 11:00 am, sibhod <[email protected]> wrote:
> > >>>> Thanks for the quick response! I'll update my files.
>
> > >>>> On Jan 29, 8:54 am, Fabrice <[email protected]> wrote:
>
> > >>>>> Hey sibhod,
> > >>>>> thanks for pointing out that one.
> > >>>>> was little but nasty.
>
> > >>>>>http://www.closier.nl/playground/PathExtrude_scalefix.swf
>
> > >>>>> this is the test code I've quickly typed to make that fixe
>
> > >>>>> var aPoints = [];
> > >>>>>                         //square
>
> > >>>>>                         aPoints.push(new Number3D(-100, 100, 0));
> > >>>>>                         aPoints.push(new Number3D(0, 100, 0));
> > >>>>>                         aPoints.push(new Number3D(100, 100, 0));
> > >>>>>                         aPoints.push(new Number3D(100, 0, 0));
> > >>>>>                         aPoints.push(new Number3D(100, -100, 0));
> > >>>>>                         aPoints.push(new Number3D(0, -100, 0));
> > >>>>>                         aPoints.push(new Number3D(-100, -100, 0));
> > >>>>>                         aPoints.push(new Number3D(-100, 0, 0));
> > >>>>>                         aPoints.push(new Number3D(-100, 100, 0));
>
> > >>>>>                         var aPath:Array = [ new Number3D(-500, 0,
> > >>>>> 0), new Number3D(-250, 0,
> > >>>>> 0),  new Number3D(0, 0, 0)];
>
> > >>>>>                         var path:Path = new Path(aPath);
>
> > >>>>>                         var aScale = [];
> > >>>>>                         aScale.push(new Number3D(1, 1, 1));
> > >>>>>                         aScale.push(new Number3D(1, 1, 3));
>
> > >>>>>                         pathextrude= new PathExtrude(path,
> > >>>>> aPoints, aScale, null,
> > >>>>> {smoothscale:true, flip:false, aligntopath:true, coverall:true,
> > >>>>> scaling:6, closepath:false, recenter:false, material:mat,
> > >>>>> subdivision:
> > >>>>> 10, bothsides:false});
>
> > >>>>>                         this.scene.addChild(pathextrude);
>
> > >>>>> displays now exactly as expected.
>
> > >>>>> svn is updated
>
> > >>>>> Fabrice
>
> > >>>>> On Jan 29, 2009, at 7:12 AM, sibhod wrote:
>
> > >>>>>> I updated to the latest svn trunk, and tried many different
> > >>>>>> methods,
> > >>>>>> but the "scales" prop on PathExtrude still doesn't work the way I
> > >>>>>> expect it.
>
> > >>>>>> For example, if I have a simple square profile extruded on a one-
> > >>>>>> segment path that runs from (100, 100, 100) to (-100, -100, -100)
> > >>>>>> it
> > >>>>>> appears like a diagonal rectangular box. The problems appear  
> > >>>>>> when I
> > >>>>>> attempt to usescales, with or without smoothscale. If I want the
> > >>>>>> box
> > >>>>>> to taper as it extrudes, I pass ascalesparam: new Array(new
> > >>>>>> Number3D
> > >>>>>> (1,1,1), new Number3D(3, 3, 3)). Not only does the profile scale,
> > >>>>>> but
> > >>>>>> the v1 point is now well beyond (-100, -100, -100), and appears
> > >>>>>> to be
> > >>>>>> multiplied by the scale as well.
>
> > >>>>>> Also, the extrude seems to add an extra segment to the profile  
> > >>>>>> that
> > >>>>>> returns to the last point in the extrude path, unscaled. I've
> > >>>>>> found a
> > >>>>>> cheap work-around where my path generator divides each segment
> > >>>>>> position by its scale, but I wanted to see if I am doing  
> > >>>>>> something
> > >>>>>> wrong.
>
> > >>>>>> Thanks again!
>
> > >>>>>> On Jan 26, 7:46 pm, sibhod <[email protected]> wrote:
> > >>>>>>> I haven't had a chance to try out your suggestions, but I wanted
> > >>>>>>> to
> > >>>>>>> that you so much for your help! I'll be sure to post my results
> > >>>>>>> when I
> > >>>>>>> finally have some.
>
> > >>>>>>> On Jan 15, 5:33 pm, Fabrice <[email protected]> wrote:
>
> > >>>>>>>> ThepathExtrudedo not change the points coordinates except if  
> > >>>>>>>> you
> > >>>>>>>> pass aligntopath:true
> > >>>>>>>> the scale works per Curvesegments, and a scale Number3D is
> > >>>>>>>> required
> > >>>>>>>> for that segment.
> > >>>>>>>> you just pass a series of Number3D's in an array and they will
> > >>>>>>>> affect
> > >>>>>>>> the whole segment. Smoothscale prop will define if its
>
> ...
>
> read more »

Reply via email to