Author: Max Pellizzaro
Date: October 29th 2008
version: 3.0.3

Extruding using a circular path

Objective of the tutorial

In this last tutorial we will see how to use a class called Lathe that will allows you to define extrusion on a circular path defining starting angle, ending angle, radius, rotation axis and so on…

How to

Set up

No need to set up for this tutorial, just download the classes and they are ready to go.

example46.zip

The AS Code

In this section we report the AS code as a reference, and it will be explained in the next paragraph.

package {
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.*;
    import flash.ui.*;
	import flash.geom.Point;
	
	import sandy.core.Scene3D;
	import sandy.core.scenegraph.Camera3D;
	import sandy.core.scenegraph.Group;
	import sandy.core.scenegraph.Shape3D;
	import sandy.materials.*;
	import sandy.materials.attributes.*;
	import sandy.primitive.Box;
	import sandy.primitive.Line3D;
	import sandy.extrusion.Extrusion;
	import sandy.extrusion.data.*;
	import sandy.core.data.*;

	public class Example046 extends Sprite {

		private var scene:Scene3D;
		private var camera:Camera3D;
		private var c:Box;
		private var ext:Extrusion;
		
		public function Example046() {
			
			camera = new Camera3D(stage.stageWidth, stage.stageHeight);
			scene = new Scene3D("myScene", this, camera , new Group("root"));
			
			var arrayElm:Array = new Array();
			arrayElm[0] = new Point(0,-10);	arrayElm[1] = new Point(0,10);	arrayElm[2] = new Point(30,10); arrayElm[3] = new Point(30,0);
			arrayElm[4] = new Point(20,0);	arrayElm[5] = new Point(20,5);	arrayElm[6] = new Point(10,5); arrayElm[7] = new Point(10,-10);
			arrayElm[8] = new Point(0,-10);
			
			var sectionElm:Polygon2D = new Polygon2D(arrayElm);
		    
			
			var lathe1:Lathe = new Lathe (new Vector, new Vector (1, 1, 1), new Vector (1, 0, 0), 0, 4, 0.05);
            
			// create extrusion
			ext = new Extrusion ("ext0", sectionElm, lathe1.toSections ()); 
			ext.appearance = new Appearance (new ColorMaterial (0x990000, 1,
				new MaterialAttributes (new LightAttributes( true, 0.1))));
			ext.appearance.frontMaterial.lightingEnable = true;
            ext.pan = -40;
			ext.rotateX = -80;
			ext.pan = -40;
			ext.x = 20;
			ext.z = -100; 
			
			scene.root.addChild(ext);
			
			
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMovedHandler);
			addEventListener(Event.ENTER_FRAME, render);
		}

		private function render(event:Event):void {
			scene.render();
			//ext.rotateX += 4;
		}
		
		private function mouseMovedHandler(event:MouseEvent):void {
           //ext.pan=(event.stageX-550/2)/5;
		   //ext.tilt=(event.stageY-400/2)/20;
 
        }
	}
}

Examining the code

We start by defining a simple polygon2D that we want to extrude in a circular way:

var arrayElm:Array = new Array();
arrayElm[0] = new Point(0,-10);	arrayElm[1] = new Point(0,10);	
arrayElm[2] = new Point(30,10); arrayElm[3] = new Point(30,0);
arrayElm[4] = new Point(20,0);	arrayElm[5] = new Point(20,5);	
arrayElm[6] = new Point(10,5); arrayElm[7] = new Point(10,-10);
arrayElm[8] = new Point(0,-10);
 
var sectionElm:Polygon2D = new Polygon2D(arrayElm);

And now we just need to use the Lathe class

var lathe1:Lathe = new Lathe (new Vector, new Vector (1, 1, 1), new Vector (1, 0, 0), 0, 4, 0.05);

Since there is not much to do, probably it's better to list here the parameters of the Lath class:

 
* Generates circular, spiral or helix arc.
 
@param	center Arc center.
@param	axis Axis of revolution.
@param	reference A vector that specifies direction to count angle from. Must be non-collinear to axis.
@param	angle0 Start angle.
@param	angle1 End angle.
@param	step Angle step.
@param	radius0 Start radius.
@param	radius1 End radius.
@param	height0 Start height.
@param	height1 End height.
@param	scale0 Start scale.
@param	scale1 End scale.
 
public function Lathe (center:Vector, axis:Vector, reference:Vector, 
angle0:Number = 0, angle1:Number = Math.PI, step:Number = 0.3, 
radius0:Number = 100, radius1:Number = 100, height0:Number = 0, 
height1:Number = 0, scale0:Number = 1, scale1:Number = 1)

Let’s see our result now.

The output