package { import flash.display.Sprite; import flash.geom.PerspectiveProjection; import flash.display.DisplayObjectContainer; import flash.geom.Utils3D; import flash.geom.Vector3D; import flash.geom.Matrix3D; import flash.geom.*; import flash.events.Event; public class FishPoint extends Sprite { public var colour:uint; private var vertices:Vector. = new Vector.(); private var projectedVerts:Vector. = new Vector.(); private var projectionMatrix:Matrix3D; private var perspective:PerspectiveProjection; private var points:Vector.; private var uvts:Vector. = new Vector.(); public var xp:Number = 0; public var yp:Number = 0; public var zp:Number = 0; public var xr:Number = 0; public var yr:Number = 0; public var zr:Number = 0; public var velocity:Vector3D = new Vector3D(0,0,0); public function FishPoint(col:uint=0x0000ff) { colour = col; init(); } private function init():void { perspective = new PerspectiveProjection(); perspective.fieldOfView = 50; //3D transformation matrix - used to rotate object points = Vector.([ new Point(-100,-40),// top left corner (top of tail) new Point(0,80),// bottom curve target - fish's belly new Point(100,0),// head new Point(0,-80),// top curve target (fish's back) new Point(-100,40)// bottom left corner (bottom of tail) ]); //we must convert the array of points to a vertices vector points.forEach(function(i:Point,n:int, a:Vector.):void { vertices.push(i.x,i.y,0); }); addEventListener(Event.ENTER_FRAME, onEnterFrame); //render(); } public function render():void { projectionMatrix = perspective.toMatrix3D(); projectionMatrix.prependTranslation(xp+=velocity.x,yp+=velocity.y,zp+=velocity.z); projectionMatrix = Utils3D.pointTowards(1,projectionMatrix,parent.getChildByName("target").transform.getRelativeMatrix3D(this).position, new Vector3D(1,0,0), new Vector3D(0,-1,0)); Utils3D.projectVectors(projectionMatrix, vertices, projectedVerts, uvts); graphics.clear(); graphics.beginFill(colour); graphics.moveTo(projectedVerts[0],projectedVerts[1]); graphics.curveTo(projectedVerts[2], projectedVerts[3],projectedVerts[4], projectedVerts[5]); graphics.curveTo(projectedVerts[6], projectedVerts[7],projectedVerts[8], projectedVerts[9]); } private function onEnterFrame(event:Event):void { render(); } } } // Copyright (c) 2008 David Wilhelm // MIT license: http://www.opensource.org/licenses/mit-license.php