2008年12月02日

Papervision3Dをいじってみたり

ActionScript勉強の一環としてPapervision3Dをいじってみました。 白いのを突っつくと跳ねます。

FlashPlayer9以上が必要です。

ソースコードは↓に

package {
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.media.Camera;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;

	public class Main extends Sprite {
		// キューブの設定
		private const WIDTH:Number = 100;
		private const HEIGHT:Number = 100;
		private const DEPTH:Number = 100;
		private const SPACE:Number = 20;
		private const CUBE_NUM:uint = 1;
		
		// 物理定数
		private const GRAVITY:Number = -9.8;
		private const E:Number = 0.5;
		
		// 3D設定
		private var scene:Scene3D;
		private var viewport:Viewport3D;
		private var camera:Camera3D;
		private var render:BasicRenderEngine;
		
		public function Main() {
			scene = new Scene3D();
			viewport = new Viewport3D(400, 300);
			camera = new Camera3D();
			render = new BasicRenderEngine();
			
			addChild(viewport);
			
			var material:ColorMaterial = new ColorMaterial(0xFFFFFF);
			var materialsList:MaterialsList = new MaterialsList({all:material});
			
			for(var i:uint = 0; i < CUBE_NUM; i++) {
				var cube:DisplayObject3D = new Cube(materialsList, WIDTH, HEIGHT, DEPTH);
				cube.x = i * WIDTH + SPACE;
				cube.extra = new Object();
				cube.extra.vy = 0;
				scene.addChild(cube, 'cube' + i);
			}
			
			camera.x = 500;
			camera.y = 500;
			camera.lookAt(getCube(Math.floor(CUBE_NUM / 2)));
			
			addEventListener(Event.ENTER_FRAME, renderCube);
			addEventListener(MouseEvent.CLICK, bound);
		}
		
		/**
		 * レンダリング
		 * @param	evt
		 */
		private function renderCube(evt:Event):void {
			render.renderScene(scene, camera, viewport);
		}
		
		/**
		 * キューブをクリックすると飛び跳ねる
		 * @param	evt
		 */
		private function bound(evt:MouseEvent):void {
			for(var i:uint = 0; i < CUBE_NUM; i++) {
				var cube:DisplayObject3D = getCube(i)
				cube.extra.vy = 60;
			}
			stage.addEventListener(Event.ENTER_FRAME, fall);
		}
		
		/**
		 * 落ちる動作
		 * @param	evt
		 */
		private function fall(evt:Event):void {
			for(var i:uint = 0; i < CUBE_NUM; i++) {
				var cube:DisplayObject3D = getCube(i)
				cube.y += cube.extra.vy;
				cube.extra.vy += GRAVITY;
				
				if(cube.y < 0) {
					cube.y = 0;
					cube.extra.vy *= -E;
					stage.removeEventListener(Event.ENTER_FRAME, fall);
				}
			}
		}
		
		/**
		 * 指定したIDのキューブを返す
		 * @param	id
		 * @return	cube:DisplayObject3D
		 */
		private function getCube(id:uint):DisplayObject3D {
			return scene.getChildByName('cube' + id);
		}
	}
}

例によって「FLASH OOP for ActionScript 3.0 (翔泳社)」を参考に。 ソースの理解よりもライブラリの読み込み方に苦労しました。

全然3Dっぽくないけどそこは練習ということで。




同じカテゴリー(プログラミング)の記事画像
GoogleReaderを3ペイン表示にするスクリプトのα版
文字サイズを拡大縮小するスクリプト
電卓を表示するブックマークレット
Twitterで費やした時間を表示するスクリプト
ニコニコのタグをプレビューするスクリプト
ニコニコで広告を消すスクリプト
同じカテゴリー(プログラミング)の記事
 GoogleReaderを3ペイン表示にするスクリプトのα版 (2009-07-26 22:00)
 クリック動作を無効にするジョークブックマークレット (2009-07-19 23:52)
 文字サイズを拡大縮小するスクリプト (2009-07-12 18:09)
 ダブルクリックでスクロールするスクリプト (2009-07-05 14:22)
 電卓を表示するブックマークレット (2009-06-27 21:40)
 ごくごく一部の顔文字を絵文字に置き換えるスクリプト (2009-05-21 23:06)
Posted by Handle at 00:08│Comments(0)プログラミング
コメントフォーム
上の画像に書かれている文字を入力して下さい
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。