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

Papervision3d入門 2.5.5

Flash3D コンテンツ制作のためのPapervision3Dのサンプルテスト	

code 2.5.5
/**
 * Copyright ug24k8 ( http://wonderfl.net/user/ug24k8 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/zoAk
 */

// forked from yawakisin's Papervision3d入門 2.5.4
/*
	Flash3D コンテンツ制作のためのPapervision3Dのサンプルテスト	
	
	code 2.5.5
*/

package 
{
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import flash.system.*;
	import org.papervision3d.view.*;
	import org.papervision3d.materials.*;
	import org.papervision3d.objects.primitives.*;
	
	public class Sample3 extends BasicView {
		private var rot:Number = 0;
		// 一時的なマウスの値を格納する変数
		private var oldX:Number = 0;
		// 目標角度
		private var targetRot:Number = 0;
		// マウスを押した状態かどうかを判別するフラグ
		private var isMouseDown:Boolean = false;
		
		// コンストラクタ
		public function Sample3() 
		{
			var urlReq:URLRequest = new URLRequest(new String("http://assets.wonderfl.net/images/related_images/2/29/2957/295773efe549b4206f0ab5e4e776915fb02f95ff"));
			var loader:Loader = new Loader();
			loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, init);
			loader.load(urlReq, new LoaderContext(true));		
		}
		
		private function init(e:Event):void 
		{
			var loader:Loader = Loader(e.target.loader);
			// ロードしたデータからbitmaDataを作成する。
			var bmdata:BitmapData = new BitmapData(loader.width, loader.height);
			bmdata.draw(loader);

			// マテリアルを作成
			var material:BitmapMaterial = new BitmapMaterial(bmdata);
			
			// 球体(Sphere)を作成
			// 引数はマテリアル、球面の半径、横のポリゴン分割数、縦のポリゴン分割数
			var sphere:Sphere = new Sphere(material, 400, 16, 16);
			
			// 3D空間に球体を追加
			scene.addChild(sphere);
			
			// レンダリング
			startRendering();

			// エンターフレームのイベントを登録
			addEventListener(Event.ENTER_FRAME, loop);
			stage.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP, upHandler);
			stage.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
		}
		
		// アニメーション
		private function loop(e:Event):void 
		{
			// イージングの公式を用いて滑らかにする
			// 値 += (目標値 - 現在の値) * 減速値
			rot += (targetRot - rot) * 0.05;
			
			// 角度に応じてカメラの位置を設定
			var deg:Number = rot * Math.PI / 180;
			camera.x = 1000 * Math.sin(deg);
			camera.z = 1000 * Math.cos(deg);
		}

		private function downHandler(e:MouseEvent):void 
		{
			isMouseDown = true;
			oldX = e.stageX;	// mouseX でもー
		}
		
		private function upHandler(e:MouseEvent):void 
		{
			isMouseDown = false;		
		}

		private function moveHandler(e:MouseEvent):void 
		{
			if (isMouseDown)
			{
				// マウスが以前いた位置のx座標からの移動距離を算出
				var dx:Number = e.stageX - oldX;
				// 目標角度に移動距離の値を加算
				targetRot += dx / 4;
				// oldX にマウスのX座標を代入
				oldX = e.stageX;
			}
		}
		
	}
}