開発環境 Apache Flex SDK 4.12.1
FlashDevelop 4.6.1
実行環境 Microsoft Windows 8.1 (64bit)
プロジェクトの種類 ActionScript 3/AS3 Project
プロジェクト名 Wireframe

参考

Main.as
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.ui.Keyboard;
 
	/**
	 * ...
	 * @author
	 */
	public class Main extends Sprite
	{
		private var vertices:Array = [
			new Vector3(0, 0.5, 0),
			new Vector3(0.5, -0.5, 0),
			new Vector3( -0.5, -0.5, 0),
		];
		private var lastPosition:Point = new Point();
 
		public function Main():void
		{
			if (stage)
				init();
			else
				addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			// entry point
 
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
		}
 
		private function translate(dx:Number, dy:Number):void
		{
			for each (var vertex:Vector3 in vertices)
			{
				vertex.x += dx;
				vertex.y += dy;
			}
		}
 
		private function project(v:Vector3):Point
		{
			return new Point((v.x + 1) * stage.stageWidth / 2, (-v.y + 1) * stage.stageHeight / 2);
		}
 
		private function enterFrameHandler(e:Event):void
		{
			graphics.clear();
 
			graphics.lineStyle(5, 0x8888ff);
 
			var point:Point = project(vertices[0]);
			graphics.moveTo(point.x, point.y);
 
			for (var i:int = vertices.length - 1; 0 <= i; i--)
			{
				point = project(vertices[i]);
				graphics.lineTo(point.x, point.y);
			}
		}
 
		private function keyDownHandler(e:KeyboardEvent):void
		{
			switch (e.keyCode)
			{
				case Keyboard.A: 
					translate(-0.1, 0);
					break;
				case Keyboard.W: 
					translate(0, 0.1);
					break;
				case Keyboard.D: 
					translate(0.1, 0);
					break;
				case Keyboard.S: 
					translate(0, -0.1);
					break;
			}
		}
 
		private function mouseMoveHandler(e:MouseEvent):void
		{
			if (e.buttonDown)
			{
				rotateY(0.02 * (e.localX - lastPosition.x));
				rotateX(0.02 * (e.localY - lastPosition.y));
			}
			lastPosition.x = e.localX;
			lastPosition.y = e.localY;
		}
 
		private function rotateX(angleRadians:Number):void
		{
			for each (var vertex:Vector3 in vertices)
			{
				var s:Number = Math.sin(angleRadians);
				var c:Number = Math.cos(angleRadians);
				var y:Number = c * vertex.y - s * vertex.z;
				var z:Number = s * vertex.y + c * vertex.z;
				vertex.y = y;
				vertex.z = z;
			}
		}
 
		private function rotateY(angleRadians:Number):void
		{
			for each (var vertex:Vector3 in vertices)
			{
				var s:Number = Math.sin(angleRadians);
				var c:Number = Math.cos(angleRadians);
				var x:Number = c * vertex.x + s * vertex.z;
				var z:Number = -s * vertex.x + c * vertex.z;
				vertex.x = x;
				vertex.z = z;
			}
		}
 
	}
 
}
 
最終更新:2014年06月12日 16:09