Actionscript:
-
[SWF(width = 500, height = 500, backgroundColor = 0x000000)]
-
var halfWidth:Number = stage.stageWidth / 2;
-
var halfHeight:Number = stage.stageHeight / 2;
-
var loc:Vector.<Number>;
-
-
graphics.lineStyle(0, 0xFF0000);
-
graphics.moveTo(halfWidth, 0);
-
graphics.lineTo(halfWidth, stage.stageHeight);
-
graphics.moveTo(0, halfHeight);
-
graphics.lineTo(stage.stageWidth, halfHeight);
-
-
var line:Shape = Shape(addChild(new Shape()));
-
line.x = halfWidth;
-
-
var idle:Function = function(){};
-
var currentMode:Function = idle;
-
stage.addEventListener(MouseEvent.MOUSE_DOWN, onDown);
-
stage.addEventListener(MouseEvent.MOUSE_UP, onUp);
-
addEventListener(Event.ENTER_FRAME, onLoop);
-
function onDown(evt:MouseEvent):void{
-
if (contains(frame)){
-
removeChild(frame);
-
currentMode = idle;
-
line.graphics.clear();
-
return;
-
}
-
loc = new Vector.<Number>();
-
line.graphics.lineStyle(0,0xFFFFFF);
-
line.x = halfWidth
-
line.y = halfHeight;
-
line.graphics.moveTo(line.mouseX, line.mouseY);
-
currentMode = captureLocs;
-
canvas.fillRect(canvas.rect, 0x000000);
-
}
-
function onUp(evt:MouseEvent):void{
-
if (currentMode == idle) return;
-
setupLathe();
-
currentMode = showLathe;
-
}
-
-
function onLoop(evt:Event):void{
-
currentMode();
-
}
-
function captureLocs():void{
-
loc.push(line.mouseX);
-
loc.push(line.mouseY);
-
loc.push(0);
-
line.graphics.lineTo(line.mouseX, line.mouseY);
-
}
-
/**
-
-- Lathe Stuff:
-
*/
-
var canvas:BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight,false, 0x000000);
-
var frame:Bitmap = new Bitmap(canvas);
-
var dx:Number=0;
-
var dy:Number=0;
-
var matrix:Matrix3D = new Matrix3D();
-
var pVerts:Vector.<Number>;
-
var uvts:Vector.<Number>;
-
function setupLathe():void{
-
addChild(frame);
-
pVerts = new Vector.<Number>();
-
uvts = new Vector.<Number>();
-
var nVerts:Vector.<Number> = new Vector.<Number>();
-
var tVerts:Vector.<Number> = new Vector.<Number>();
-
matrix.identity();
-
var step:Number = 2;
-
for (var i:int = 0; i <360; i+=step){
-
matrix.appendRotation(step,Vector3D.Y_AXIS);
-
matrix.transformVectors(loc, tVerts);
-
nVerts = nVerts.concat(tVerts);
-
}
-
loc = nVerts.concat();
-
}
-
function showLathe():void{
-
dx += (mouseX - dx)/4;
-
dy += (mouseY - dy)/4;
-
matrix.identity();
-
matrix.appendRotation(dy,Vector3D.X_AXIS);
-
matrix.appendRotation(dx,Vector3D.Y_AXIS);
-
matrix.appendTranslation(halfWidth, halfHeight, 0);
-
Utils3D.projectVectors(matrix, loc, pVerts, uvts);
-
canvas.lock();
-
canvas.fillRect(canvas.rect, 0x000000);
-
var leng:int = pVerts.length;
-
for (var i:int = 0; i<leng; i+=2){
-
canvas.setPixel( pVerts[i], pVerts[i + 1], 0xFFFFFF);
-
}
-
canvas.unlock();
-
}
This snippet allows you to create 3D lathe shapes by drawing a 2D line. This is done using Utils3D.projectVectors() and Matrix.transformVectors().
Have a look at the swf here...
3 Comments
Nice one!
Pretty ::)
Waow ! This is incredible !
The code looks very simple but the results are just amazing.
Thanks a lot !