package com.dafishinsea.panorama { import flash.display.Sprite; import flash.events.Event; import com.dafishinsea.models.Sphere; import flash.display.TriangleCulling; import flash.geom.PerspectiveProjection; import flash.geom.Utils3D; import flash.geom.Vector3D; import flash.geom.Matrix3D; import flash.geom.Point; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.display.Bitmap; import flash.display.BitmapData; //import com.carlcalderon.arthropod.Debug; [SWF(backgroundColor="0x000000", width="600", height="600", frameRate="30")] public class PanoramaTest extends Sprite { private var sphere:Sphere; private var canvas:Sprite; private var projectedVerts:Vector. = new Vector.(); private var perspective: PerspectiveProjection; private var projectionMatrix : Matrix3D; [Embed(source="images/Monp.jpg")] private var pano:Class; private var texture:Bitmap = new pano() as Bitmap; private var turn:Number = 0; public function PanoramaTest() { init(); } private function init():void { //we need to work around the fact that Utils3D.projectVectors disregards the projection center //of the projectionMatrix it is passed .. it always projects around 0,0 //so we must render things on a canvas centered on stage canvas = new Sprite(); canvas.x = stage.stageWidth/2; canvas.y = stage.stageHeight/2; addChild(canvas); sphere = new Sphere(400, 10); sphere.z = 1;//ensure that sphere gets a transform.matrix3D created canvas.addChild(sphere); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { turn++; renderSphere(); } private function renderSphere():void { //Debug.log("projectionCenter="+root.transform.perspectiveProjection.projectionCenter.x); var sphereVerts:Vector. = new Vector.(); sphere.transform.matrix3D.transformVectors(sphere.vertices, sphereVerts); //drawTriangles using translated vertices projectionMatrix = root.transform.perspectiveProjection.toMatrix3D(); projectionMatrix.prependTranslation(0,0,400);//< 20 some funny stuff happens //note I had to increase the z-offset after release of fp 10..22 projectionMatrix.prependRotation(180,new Vector3D(0,0,1)); projectionMatrix.prependRotation(turn,new Vector3D(0,1,0)); Utils3D.projectVectors(projectionMatrix, sphereVerts, projectedVerts, new Vector.()); canvas.graphics.clear(); /*canvas.graphics.beginFill(0xFFFFFF); canvas.graphics.lineStyle(1,0xcccccc,1);*/ canvas.graphics.beginBitmapFill(texture.bitmapData,null, false, false); canvas.graphics.drawTriangles(projectedVerts, sphere.indices, sphere.uvtData, TriangleCulling.NEGATIVE); canvas.graphics.endFill(); } } }