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

TriangleMesh3Dの貼り付け

http://wonderfl.net/code/1034a79d9022a8f5bbbdf763dd68a871d81f3c9e
「宇宙」を参考に、Sphereとcubeの面の位置にTriangleMesh3Dを貼り付けてみました。
なお、光り輝くロジックは、「宇宙」のロジックをそのまま使用しました。また、面の位置の取り出しは
http://zapruder.main.jp/blog/?cat=3
を参考にしました。

「課題」
簡単にTriangleMesh3Dを自由な位置に設置できるロジックを考えたい。
Get Adobe Flash player
by hankuro 13 Oct 2009
    Embed
/**
 * Copyright hankuro ( http://wonderfl.net/user/hankuro )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/cfP5
 */

package 
{
	import caurina.transitions.Tweener;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.filters.BlurFilter;
	import flash.geom.ColorTransform;
	import flash.geom.Point;
	import org.papervision3d.core.effects.BitmapLayerEffect;
	import org.papervision3d.core.effects.view.ReflectionView;
	import org.papervision3d.core.geom.renderables.Triangle3D;
	import org.papervision3d.core.geom.renderables.Vertex3D;
	import org.papervision3d.core.geom.TriangleMesh3D;
	import org.papervision3d.core.math.NumberUV;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.special.ParticleMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.DisplayObject3D;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.objects.special.ParticleField;
	import org.papervision3d.view.BasicView;
	import org.papervision3d.view.layer.BitmapEffectLayer;
	
	[SWF(width = "500", height = "500", backgroundColor = "0" )] 
	
	/**
	 * http://wonderfl.net/code/1034a79d9022a8f5bbbdf763dd68a871d81f3c9e
	 * 「宇宙」を参考に、Sphereとcubeの面の位置にTriangleMesh3Dを貼り付けてみました。
	 * なお、光り輝くロジックは、「宇宙」のロジックをそのまま使用しました。また、面の位置の取り出しは
	 * http://zapruder.main.jp/blog/?cat=3
	 * を参考にしました。
	 * 
	 * 「課題」
	 * 簡単にTriangleMesh3Dを自由な位置に設置できるロジックを考えたい。
	 */
	public class Main extends BasicView
	{
		public var sphere:Sphere;
		public var cube:Cube;
		public var cylinder:Cylinder;
		public var plane:Plane;
		private var coltrans:ColorTransform;
		private var angle:Number = 0;
		private var bfm:BitmapEffectLayer;
		private var bfm_p:BitmapEffectLayer;
		private var obj3D:DisplayObject3D;
		private var num:Number = 0;
		private var cheng_sw:Boolean = false;
		private var meshface:Triangle3D;
		private var mesh_array:Array;
		private var uvA:NumberUV;
		private var uvC:NumberUV;
		private var uvB:NumberUV;
		private var v0:Vertex3D;
		private var v1:Vertex3D;
		private var v2:Vertex3D;
		private var max_num:Number;
		private var triangle_init:Array = [new Vertex3D( -10, 10, 0 ),new Vertex3D( 10, 10, 0 ),new Vertex3D( 0, 0, 0 )];
		
		public function Main() 
		{
			//
			// スーパークラスのコンストラクターを呼び出す。
			//
			super(500, 500, false, false);
			//
			// カメラ位置の設定
			//
			camera.z = -400;
			// カラーの変更 引数は
			// ColorTransform(赤の乗数値,緑の乗数値,青の乗数値,アルファの乗数値,
			// 赤のオフセット,緑のオフセット,青のオフセット,アルファのオフセット)
			coltrans = new ColorTransform(0, 0, 0, 1, 0, 0, 0, 0);
			//
			// 回転用の空のオブジェクト
			//
			obj3D = new DisplayObject3D();
			scene.addChild(obj3D);
			//
			// モデルとなる形(今回は、sphereとcubeのみ)の宣言とモデルの最大面数取得
			//
			var wire:WireframeMaterial = new WireframeMaterial(0xFFFFFF,0);
			sphere = new Sphere(wire, 100, 20, 20);
			cube = new Cube(new MaterialsList( { all:new ColorMaterial(0xFF0000, 100) } ), 200, 200, 200, 7, 7, 5);
			cylinder = new Cylinder(new ColorMaterial(0xFF0000, 0), 200, 200, 16, 15,-1);
			plane = new Plane(new ColorMaterial(0xFF0000, 0), 200, 200, 15, 15);
			max_num = Math.max(sphere.geometry.faces.length, cube.geometry.faces.length, cylinder.geometry.faces.length, plane.geometry.faces.length);
			trace (max_num);
			// 
			// マテリアルの宣言。なお、スモークのようなマテリアルはBitmapEffectLayerです。また、BitmapEffectLayerはParticleFieldとriangleMesh3D分けています。
			//
			var mtr:ParticleMaterial =  new ParticleMaterial(0xFFFFFF, 10, 1);
			var particles:ParticleField = new ParticleField(mtr, 100, 5, 2000, 2000, 2000);
			obj3D.addChild(particles);
			bfm_p = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight, true, 0, "clear_pre", false, false );
			bfm_p.addEffect(new BitmapLayerEffect(new BlurFilter(10, 10, 3), false));
			viewport.containerSprite.addLayer(bfm_p);
			bfm_p.addDisplayObject3D(particles);			
			bfm = new BitmapEffectLayer(viewport, stage.stageWidth, stage.stageHeight, true, 0, "clear_pre", false, false );
			bfm.addEffect(new BitmapLayerEffect(new BlurFilter(10, 10, 3), false));
			var mat:ColorMaterial =  new ColorMaterial(0xFFFFFF);
			viewport.containerSprite.addLayer(bfm);
			//
			// TriangleMesh3Dの初期化
			//
			mesh_array = new Array(max_num);
			for (var i:Number = 0; i < max_num ; i++) {
				mesh_array[i] = new TriangleMesh3D(mat, new Array(), new Array(), null );
				v0 = new Vertex3D( -10, 10, 0 );
				v1 = new Vertex3D( 10, 10, 0 );
				v2 = new Vertex3D( 0, 0, 0 );
				mesh_array[i].geometry.vertices.push( v0 );
				mesh_array[i].geometry.vertices.push( v1 );
				mesh_array[i].geometry.vertices.push( v2 );
				uvA = new NumberUV( 0, 0 );
				uvC = new NumberUV( 1, 0 );
				uvB = new NumberUV( 0, 1 );
				mesh_array[i].geometry.faces.push( new Triangle3D( mesh_array[i], new Array(v0,v1,v2), null, new Array(uvA,uvC,uvB) ));
				mesh_array[i].geometry.ready = true;
				obj3D.addChild(mesh_array[i]);
				bfm.addDisplayObject3D(mesh_array[i]);	
			}
			addEventListener(Event.ENTER_FRAME, onRun , false, 0, true);
			startRendering();
			sphere_make();
		}
		//
		// sphereの形にTriangleMesh3Dを移動させる。
		//
		private function sphere_make():void {
			for (var i:Number = 0; i <  sphere.geometry.faces.length; i++) {
				meshface = sphere.geometry.faces[i];
				for (var n:Number = 0; n < 3; n++) {
					Tweener.addTween(mesh_array[i].geometry.vertices[n], { x: meshface.vertices[n].x,
																		   y: meshface.vertices[n].y,
																		   z: meshface.vertices[n].z,
																		   delay:i*.1,
																		   time:2,
																		   transition:"easeInOutCirc" } );
				}
			}
			Tweener.addTween(this,{delay:i*.1,onComplete:cube_make});
		}
		//
		// cubeの形にTriangleMesh3Dを移動させる。
		//
		private function cube_make():void {
			for (var i:Number = 0; i <  cube.geometry.faces.length; i++) {
				meshface = cube.geometry.faces[i];
				for (var n:Number = 0; n < 3; n++) {
					Tweener.addTween(mesh_array[i].geometry.vertices[n], { x: meshface.vertices[n].x,
																		   y: meshface.vertices[n].y,
																		   z: meshface.vertices[n].z,
																		   delay:i*.1,
																		   time:2,
																		   transition:"easeInOutCirc" } );
				}
			}
			Tweener.addTween(this,{delay:i*.1,onComplete:sphere_make});
			if (i < mesh_array.length) triangle_back(i);			
		}
		//
		// cubeの描写で余ったTriangleMesh3Dを初期位置に戻す。
		//
		private function triangle_back(p:Number):void {
			for (var i:Number = p; i < mesh_array.length ; i++) {
				for (var n:Number = 0; n < 3; n++) {
					Tweener.addTween(mesh_array[i].geometry.vertices[n], { x: triangle_init[n].x,
																		   y: triangle_init[n].y,
																		   z: triangle_init[n].z,
																		   delay:cube.geometry.faces.length*.1} );
				}
			}
		}
		//
		// フレームイベント
		//
		private function onRun(evt:Event):void {
			//
			// obj3DにaddChildされたオブジェクトの回転
			//
			obj3D.rotationY += .7;
			obj3D.rotationX += .7;
			
			//
			// カラーの変更
			//  カラー変更の計算はイマイチ勉強不足で、説明ができません。(現在勉強中)
			//
			angle+=.01;
			var sin:Number = Math.sin(angle)
			var cos:Number = Math.cos(angle)
			if (sin < .1) sin = Math.abs(sin)+.1;
			if (cos < .1) cos = Math.abs(cos)+.1;
			
			coltrans.redMultiplier = sin/4;
			coltrans.greenMultiplier = cos/2;
			coltrans.blueMultiplier = sin;
			
			bfm.drawCommand.colorTransform = coltrans;
			
		}
		
	}
	
}