Author: Max Pellizzaro
Date: October 29th 2008
version: 3.0.3
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…
No need to set up for this tutorial, just download the classes and they are ready to go.
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;
}
}
}
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.