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);
}
}