« Papervision3Dをやってみた22 | トップページ | FlexとPV3D その2 »

2008年6月15日 (日)

Papervision3Dをやってみた23

P_4





















頂点制御です。

こんな感じです。





Planeを生成するとき、第4、第5引数の分割数によって、頂点の数が決まります。

注意するのは、分割数と頂点の数は違うということです。

例えば、横の分割数を4、縦の分割数を3にした場合、横に並ぶ頂点の数は5で縦に並ぶ頂点の数は4になります。

下の図のような感じ。




P


















赤が横の頂点。緑が縦の頂点です。






今回は頂点をfor-each文で回していますが、アクセスする順番は、左下から始まって、上までアクセス、終わったら次の行に移動。

こんな感じで最後までアクセスしていきます。






分かりづらい説明ですみません。

何かの参考になればと。

以下、ソースです。

(2009/3 ソース書き直しました。)

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;
	import flash.events.Event;

	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;

	[SWF(backgroundColor="#000000")]

	public class Papervision3D_sample28 extends Sprite
	{
		[Embed(source='kurumi.jpg')]
		private var img:Class;

		private var viewport:Viewport3D;
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var renderer:BasicRenderEngine;
		private var rootNode:DisplayObject3D;
		private var plane:Plane;
		private var theta:int=0;

		public function Papervision3D_sample28()
		{
			stage.frameRate=30;
			stage.scaleMode=StageScaleMode.NO_SCALE;
			stage.align=StageAlign.TOP_LEFT;
			stage.quality=StageQuality.LOW;

			viewport=new Viewport3D(0, 0, true, true);
			scene=new Scene3D();
			camera=new Camera3D();
			renderer=new BasicRenderEngine();
			rootNode=scene.addChild(new DisplayObject3D("rootNode"));

			addChild(viewport);
			camera.zoom=30;
			camera.focus=30;
			camera.target=DisplayObject3D.ZERO;

			var bmpd:BitmapData=(new img as Bitmap).bitmapData;
			var mat:BitmapMaterial=new BitmapMaterial(bmpd, true);
			mat.doubleSided=true;
			plane=new Plane(mat, bmpd.width, bmpd.height, 15, 15);
			rootNode.addChild(plane);

			addEventListener(Event.ENTER_FRAME, onFrame);
		}

		public function onFrame(e:Event):void
		{
			var s:int=0;
			var c:int=0;

			// 頂点を制御して、サインカーブを適用
			for each (var obj:Vertex3D in plane.geometry.vertices)
			{
				obj.z=80 * Math.sin((theta + s) * Math.PI / 180);
				c++;
				if (c % 15 == 0)
					s+=20;
			}

			theta+=15;
			plane.rotationX+=0.5;
			plane.rotationY+=0.5;
			renderer.renderScene(scene, camera, viewport);
		}
	}
} 

|

« Papervision3Dをやってみた22 | トップページ | FlexとPV3D その2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1040194/21642756

この記事へのトラックバック一覧です: Papervision3Dをやってみた23:

« Papervision3Dをやってみた22 | トップページ | FlexとPV3D その2 »