Home > papervision

papervision Archive

[AS3]3d物理エンジン

ずいぶん前からその存在は知っていたんですが、
最近やっと出たみたいですね。

AS3 3D Physics Engine : WOW-Engine

ということで、早速触ってみたんですが・・・。
情報が少ない!わからないことばかり。

とりあえず今日は習作ということで。

スクリーンショットデモ

[pv3d]初めてのPaperVision3D(2)

今回も引き続き
pv3d 2.0 tutorial list[pv3d.org]から。

前回でPaperVision3Dで3D描画を行うための世界は整っているので、
今回はその世界に3Dオブジェクトを追加して表示してみます。
と、いってもチュートリアルの通りに進めたところ、すごく簡単でした。

var material:ColorMaterial = new ColorMaterial(col, 0.9);
material.doubleSided = true;

var plane:Plane = new Plane(material);
scene.addChild(plane);

こんな感じで、
ColorMaterialのインスタンスを生成します。
これが、「面」になるようで、ColorMaterialは、色の付いた面になるようです。

material.doubleSided = true;

この部分では、面の裏側も色を塗ることを指定しています。
この指定をしないと片面しか色を塗ってくれないようです。

Planeクラスは「平面」です。
Planeクラスに先ほどの「面」を引数にして生成した後、シーンにaddChildします。

これで、3D空間へ平面を置くことができました。

Planeクラスのyawメソッドなどを呼ぶと平面を回転してくれます。
どのメソッドでどのように回転するかなどは、チュートリアルのサイトの、
3d Object Movement Explorerのページが参考になります。

平面の回転や移動等をしつつ、
前回のソースコードサンプルのようにEnterFrameイベントのリスナーで、
renderer.renderSceneメソッドを呼べば、
3Dの表示&ちょっとしたアニメーションまで完成です。

スクリーンショットデモ

ちなみに、全然関係ないんですが、今回参考にしたサイトの、
7. Basic Interactivityで、

When starting out with pv3d, many as3 ninjas don’t realize you need to enable interactivity in the viewport and the material before being able to listen to the various click events.

ninjasって・・・忍者?忍者ってこんな自然に文章に混ざっても、英語圏で通じるレベルなのかぁ。ちょっと感動です。

とりあえず、チュートリアルそのままではアレなので少しだけ変えて、
今回のソースコードも公開。

/**
* PaperVision3D sample
* @author jinten.net
*/
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.cameras.FreeCamera3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;

	[SWF(backgroundColor = "#FFFFFF", width="400", height="300")]

	public class pv3d_sample1 extends Sprite {

		private var scene:Scene3D;

		private var viewport:Viewport3D;
		private var camera:Camera3D;

		private var renderer:BasicRenderEngine;

		private var planes:Array = new Array();

		public function pv3d_sample1() {
			init();
		}

		private function init():void {
			scene = new Scene3D();

			initObjects();

			viewport = new Viewport3D(400, 300);

			camera = new Camera3D(planes[0]);

			renderer = new BasicRenderEngine();

			addChild(viewport);

			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		private function enterFrameHandler(e:Event):void {
			for (var i:int = 0; i < planes.length; i++) {
				planes[i].yaw((i%2==0?2:-2));
			}
			camera.x = mouseX;
			camera.y = mouseY;

			renderer.renderScene(scene, camera, viewport);
		}

		private function initObjects():void {
			planes.push(makePlane(0xFF6666, 0, 0, 0));
			planes.push(makePlane(0x66FF66, 400, 0, 0));
			planes.push(makePlane(0x6666FF, -400, 0, 0));
			planes.push(makePlane(0xFFFF66, 0, 400, 0));
			planes.push(makePlane(0x66FFFF, 0, -400, 0));
			planes.push(makePlane(0xFF66FF, 0, 0, 400));
			planes.push(makePlane(0x666666, 0, 0, -400));
		}

		private function makePlane(col:uint, x:Number, y:Number, z:Number):Plane {
			var material:ColorMaterial = new ColorMaterial(col, 0.9);
			material.doubleSided = true;

			var plane:Plane = new Plane(material, 300, 300);
			plane.x = x;
			plane.y = y;
			plane.z = z;
			scene.addChild(plane);
			return plane;
		}
	}
}

[pv3d]初めてのPaperVision3D(1)

少し時間もあったので、最近流行のPaperVision3Dに手を出してみました。

で、3Dとかさっぱりわからないのですが、とにかく触ってれば、
必要に迫られて色々知識も増えていくだろうということでひとまず参考にしたサイトはこちら。
pv3d 2.0 tutorial list[pv3d.org]

まだ途中みたいですが、チュートリアルになってます。
順に進めていくと、PaperVision3Dでの基本部分のコードの書き方がわかります。

まずは、3Dな世界の構築部分です。
最低限必要なインスタンスは4種類。まずは、インスタンスを生成します。

viewport = new Viewport3D();
scene = new Scene3D();
camera = new FreeCamera3D();
renderer = new BasicRenderEngine();

ちなみにScene3DクラスはSceneObject3Dのサブクラス、
FreeCamera3DはCameraObject3Dのサブクラスです。
シーンやカメラには他にも種類があるようですが、
今回は参考にしたサイトで使っていたクラスをそのままです。

続いてViewport3DのインスタンスをaddChildに渡します。

addChild(viewport);

これで、描画ツリーに3D世界を追加完了。

最後にBasicRenderEngine.rendererメソッドを呼べば描画されます。

renderer.renderScene(scene, camera, viewport);

このとき、scene、camera、viewportの各インスタンスを渡してあげます。

これだけ。

簡単ですね。

まだ3Dオブジェクトを何も置いていないので、何も表示されませんが、
とりあえず今回はテンプレート的にソースコードを出しつつ今日はココまで。

コード全体は以下。

/**
* PaperVision3D sample
* @author jinten.net
*/
package {
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.FreeCamera3D;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;

	[SWF(backgroundColor = "#FFFFFF")]

	public class pv3d_sample1 extends Sprite {

		private var viewport:Viewport3D;
		private var scene:Scene3D;
		private var camera:FreeCamera3D;
		private var renderer:BasicRenderEngine;

		public function pv3d_sample1() {
			init();
		}

		private function init():void {
			viewport = new Viewport3D();
			scene = new Scene3D();
			camera = new FreeCamera3D();
			renderer = new BasicRenderEngine();

			addChild(viewport);
			addEventListener(Event.ENTER_FRAME, enterFrameHandler);
		}

		private function enterFrameHandler(e:Event):void {
			renderer.renderScene(scene, camera, viewport);
		}
	}
}

Home > papervision

Search
Google
Feeds
Meta
Advertisement

Return to page top