In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

forked from: forked from: forked from: 空間に文字を描く (重い) PerspectiveProjection

// forked from dizgid's forked from: forked from: 空間に絵を描く PerspectiveProjection
// forked from dizgid's forked from: 空間に絵を描く PerspectiveProjection
// forked from miniapp's 空間に絵を描く
package {
	import flash.display.Bitmap;
	import flash.display.GraphicsPathCommand;
	import flash.display.SpreadMethod;
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.display.Graphics; 
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Matrix3D;
	import flash.geom.PerspectiveProjection;
	import flash.geom.Point;
	import flash.geom.Utils3D;
	import flash.geom.Vector3D;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.ui.Keyboard;
	
	[SWF(backgroundColor="0xFFFFFF", width="465", height="465", frameRate="60")]
	public class Projection1 extends Sprite {
		
		//private static var identityMatrix:Matrix3D = new Matrix3D();
		private var viewport:Shape;
		private var projection:PerspectiveProjection;
		private var worldMatrix:Matrix3D;
		private var viewMatrix:Matrix3D;
		
		private var field:Sprite;
		
		private var prots:Array;
		
		public function Projection1() {
			stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			stage.addEventListener(KeyboardEvent.KEY_UP, keyUpHandler);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			
			viewport = new Shape();
			viewport.x = centerX;
			viewport.y = centerY;
			addChild(viewport);
            
			projection = new PerspectiveProjection();
			projection.fieldOfView = 60;
			
			worldMatrix = new Matrix3D();
			viewMatrix = new Matrix3D();
			viewMatrix.appendTranslation(0, 0, projection.focalLength);
			
			var tf:TextField = new TextField();
			tf.autoSize = TextFieldAutoSize.LEFT;
			tf.text = 'マウスドラッグで空間に文字を描きます。\nshiftキーを押してると回転します。';
			addChild(tf);
			
                        Wonderfl.capture_delay( 10 );
                        
			field = new Sprite;
			field.x = stage.stageWidth * 0.5;
			field.y = stage.stageHeight * 0.5;
			field.z = 0;
			this.addChild(field);
			prots = [];
			
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}
		
		public var uv:Vector.<Number> = new Vector.<Number>();
		public var verts:Vector.<Number>  = new Vector.<Number>();
		public var projectedVerts:Vector.<Number> = new Vector.<Number>();
		public var commands:Vector.<int> = new Vector.<int>();
		public var matrix:Matrix3D = new Matrix3D();
		public var isMouseDowm:Boolean = false;
		public var shiftkeyIsDown:Boolean = false;
		public var centerX:Number = stage.stageWidth / 2;
		public var centerY:Number = stage.stageHeight / 2;
		public var pmouseX:Number;
		public var pmouseY:Number;
		
		private function keyUpHandler(e:KeyboardEvent):void {
			if (e.keyCode == Keyboard.SHIFT) shiftkeyIsDown = false;
		}
		
		private function keyDownHandler(e:KeyboardEvent):void {
			if (e.keyCode == Keyboard.SHIFT) shiftkeyIsDown = true;
		}
		
		private function enterFrameHandler(e:Event):void {
			if (isMouseDowm) {				
				commands.push(GraphicsPathCommand.LINE_TO);
				verts.push(viewport.mouseX, viewport.mouseY, 0);
			}
			
			if (shiftkeyIsDown) { 
				//一フレーム前のマウス座標との差分を回転角度にする。
				//var dx:Number = mouseY - pmouseY;
				//var dy:Number = mouseX - pmouseX;
				var dx:Number = 0;
				var dy:Number = 2.5;
				worldMatrix.identity();
				worldMatrix.appendRotation(-dx, Vector3D.X_AXIS);
				worldMatrix.appendRotation(dy, Vector3D.Y_AXIS);
				// 頂点データを回転させる。
				worldMatrix.transformVectors(verts, verts);
				
				field.rotationY += dy;
			}
			
			var matrix:Matrix3D = new Matrix3D();
			matrix.append(viewMatrix);
			matrix.append(projection.toMatrix3D());
			
			//2次元に投影
			Utils3D.projectVectors(matrix, verts, projectedVerts, uv);
			

			if (isMouseDowm) {
				var preProt:ProtObj = prots[prots.length-1];
				var myprot:ProtObj = new ProtObj();
				var pos:Vector3D = new Vector3D(viewport.mouseX, viewport.mouseY, 0);
				var mtx3D:Matrix3D = field.transform.matrix3D;
				var newPos:Vector3D = Utils3D.projectVector(mtx3D, pos);
				myprot.x = newPos.x-centerX;
				myprot.y = newPos.y-centerY;
				myprot.z = -newPos.z;
				field.addChild(myprot);
				if(preProt != null){
					myprot.transform.matrix3D.pointAt(preProt.transform.matrix3D.position, Vector3D.X_AXIS, new Vector3D(0,-1,0));
				}
				prots.push(myprot);
			}
			
			/*
			var graphics:Graphics = viewport.graphics;
			graphics.clear();
			graphics.lineStyle(2, 0x0);
			graphics.drawPath(commands, projectedVerts);
			*/
			pmouseX = mouseX;
			pmouseY = mouseY;
		}
		
		private function mouseDownHandler(e:MouseEvent):void {
			commands.push(GraphicsPathCommand.MOVE_TO);
			verts.push(viewport.mouseX, viewport.mouseY, 0);
			
			isMouseDowm = true;
		}
		
		private function mouseUpHandler(e:MouseEvent):void {
			isMouseDowm = false;
		}
	}
}

import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.text.TextField;
class ProtObj extends Sprite
{
	private var bmp:Bitmap;
	public function ProtObj(){
		var size:Number = 10;
		
		var txt:TextField = new TextField();
		txt.autoSize = "left";
		txt.text = "TEXT";
		bmp = new Bitmap();
		bmp.smoothing = false;
		bmp.bitmapData = new BitmapData(txt.width,txt.height,true,0x0);
		bmp.bitmapData.draw(txt);
		
		this.addChild(bmp);
	}
}