PHP,MySQL,Flexな日々+イラストとか このページをアンテナに追加 RSSフィード Twitter

2008-12-19

ちょびっと3Dを

| 19:02 | ちょびっと3Dをを含むブックマーク ちょびっと3Dをのブックマークコメント

ひさしぶりにちょびっとPaperVision3Dをしてみました。


こんな感じ

http://moeten.info/

f:id:haru-komugi:20081219185945j:image


今回使ったライブラリ


text3Dは現在のPaperVision3Dに含まれているので楽ちんです。

ただ、上記のビルド番号840なswcでないとダメっぽいので注意。


ソースはこちら

微妙に実際のとは違います。あとソース整理していないので、かなりきちゃないです(^-^;

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"
 backgroundImage="bg.jpg"
	>
<mx:Script>
<![CDATA[
	import mx.controls.Alert;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.typography.Text3D;
	import org.papervision3d.typography.fonts.HelveticaBold;
	import org.papervision3d.typography.Font3D;
	import org.papervision3d.materials.special.Letter3DMaterial;
	import org.papervision3d.typography.VectorLetter3D;
import org.papervision3d.core.math.Number3D;
import org.papervision3d.materials.utils.MaterialsList;
import org.papervision3d.objects.primitives.Cube;
import caurina.transitions.Tweener;
import org.papervision3d.materials.BitmapFileMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.Viewport3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.effects.view.ReflectionView;
import org.papervision3d.objects.DisplayObject3D;

private var cameraTarget : DisplayObject3D;
private var camera:Camera3D;
private var scene:Scene3D;
private var render:BasicRenderEngine;
private var viewport:Viewport3D;
private var r:ReflectionView;

//初期化関数
private function init():void{
	r = new ReflectionView( myUI.width , myUI.height , true , true );
	r.viewportReflection.filters = [bf];
	r.surfaceHeight = -100;
	myUI.addChild(r);
	cameraTarget = new DisplayObject3D();
	hts.send();	
}

private var planeArr:Array = new Array();
private var cnt:int = 0;
private function makePlane():void{
	this.addEventListener(Event.ENTER_FRAME , myTimer );
	for( var i:int = 0 ; i < hts.lastResult.item.length() ;  i ++ ){
		var loader:URLLoader = new URLLoader();
		loader.load(new URLRequest(hts.lastResult.item[i].image ) );
		loader.addEventListener(Event.COMPLETE , function():void{
			cnt++;
			if( cnt == hts.lastResult.item.length() ){
				onComp();
			}
		});
	}
}
private var planeArrA:Array = new Array();
private var planeArrB:Array = new Array();
private var cube:Cube;
private function onComp():void{

	for( var i:int = 0 ; i < hts.lastResult.item.length() ;  i ++ ){
		var mat:BitmapFileMaterial = new BitmapFileMaterial( hts.lastResult.item[i].image );
		mat.doubleSided = true;
		var plane:Plane = new Plane(mat,100,100);
		plane.z = -i*10-800;
		Tweener.addTween(plane,{
								alpha:1,
								x:150,
								y:0,
								z: i * 100-2200,
								rotationY:-90,
								transition:"easeinoutquad",
								time:i*0.4
							});
		r.scene.addChild(plane);
		planeArrA[i] = plane;

		var plane2:Plane = new Plane(mat,100,100);
		plane2.z = -i*10-800;
		Tweener.addTween(plane2,{
								alpha:1,
								x:-150,
								y:0,
								z: i * 100-2200,
								rotationY:-90,
								transition:"easeinoutquad",
								time:i*0.4
							});
		r.scene.addChild(plane2);
		planeArrB[i] = plane2;
	}
	r.camera.z = -3200;
	r.camera.y = 100;	
	Tweener.addTween( r.camera , {
								delay:0.1,	
								z:-200,
								y:0,
								time:20
		
							});
	var mat2:BitmapFileMaterial = new BitmapFileMaterial("47.jpg");
	var matlist:MaterialsList = new MaterialsList({all:mat2});
	cube = new Cube(matlist,100,100,100,4,4,4);
	cube.z = 0
	r.scene.addChild(cube);
	r.camera.target = cube;
    t = new Twist( cube );
    axis = new Number3D(1, 0, 0);
	Tweener.addTween(cube,{
							delay:9,
							rotationY:1280,
							transition:"easeinoutquad",							
							time:3,
							onStart:function():void{
//								expandPlane();
							},
							onComplete:function():void{
								setWord();
							}
						});
}
private var word:Text3D;
private function setWord():void{
	var lettermat:Letter3DMaterial = new Letter3DMaterial();
	lettermat.fillColor = 0xffccff;
	word = new Text3D("moeten.info" , new HelveticaBold() , lettermat );
	word.y = 0;
 	word.z = cube.z;
 	word.scale = 0.8;
 	word.useOwnContainer = true;
 	Tweener.addTween( word ,{
 							y:140,
							rotationY:360, 							
							transition:"easeinoutquad",							
							time:2,
							onComplete:function():void{
								rotated();						
							}
					 	});
	r.scene.addChild(word);
}
private function rotated():void{
	rotateWords();
 	
 	Tweener.addTween( gf2 ,{
 							blurX:16,
					 		blurY:16,
					 		alpha:0.5,
							transition:"easeinoutquad",							
							time:1,
							onComplete:function():void{
								rotated2();
							}
				 	});
}
private var onAnimed:Boolean = false;
private function rotated2():void{
	onAnimed = true;
	word.filters = [gf2];
	r.camera.target = cube;

}
private function expandPlane():void{
	for( var i:int = 0 ; i < planeArrA.length ; i ++ ){
 		Tweener.addTween( planeArrA[i] ,{
 							x:Math.random()*600-200,
				 			z:Math.random()*600-200,
							transition:"easeinoutquad",							
							time:1,
							onComplete:function():void{
								Plane(planeArrA[i]).lookAt(r.camera);	
							}
				 	});		
		Plane(planeArrB[i]).lookAt(r.camera);
 		Tweener.addTween( planeArrB[i] ,{
 							x:-Math.random()*600-200,
				 			z:-Math.random()*600-200,
							transition:"easeinoutquad",							
							time:1,
							onComplete:function():void{
								Plane(planeArrB[i]).lookAt(r.camera);	
							}
				 	});		
	}
}
private function onMouseMove(e:MouseEvent):void{
}
private function rotateWords() : void {
	var drx:Number = Math.round(Math.random() * 2 - 1) * 360;
	var dry:Number = Math.round(Math.random() * 2 - 1) * 360;
	var drz:Number = Math.round(Math.random() * 2 - 1) * 360;
	rotateLetters( word , drx , dry , drz);
}
private function rotateLetters(word : Text3D , drx:Number , dry:Number , drz:Number) : void {
	for each (var do3d:DisplayObject3D in word.letters) {
		if(Tweener.isTweening(do3d))return;
 		Tweener.addTween( do3d , {
	 				delay:Math.random()*1,
	 				rotationY:do3d.rotationY + dry ,
	 				rotationZ:do3d.rotationZ + drz ,
					rotationX:do3d.rotationX + drx,
					time:2
	 	});
 	}
} 

private var a:Number = 0;
private var t:Twist;  
private var axis:Number3D  =new Number3D(0, 1, 0);
private var center:Number3D = new Number3D(0, 0, 0);
private function myTimer( e:Event ):void{

	if( onAnimed ){
//		var reach:Number = 0.001;
//		var ease:Number = 0.01;
//		var cameraDistance:Number = r.camera.z;
//		r.camera.x += (Math.sin(mouseX * reach) *   cameraDistance - r.camera.x) * ease;
//		r.camera.z += (Math.cos(mouseX * reach) *   cameraDistance - r.camera.z) * ease;
	}
	r.singleRender();
}	
]]>
</mx:Script>
<mx:GlowFilter id="gf1" blurX="3" blurY="3" color="0xffffff"  strength="10"/>
<mx:BlurFilter id="bf" blurX="4" blurY="4" />
<mx:GlowFilter id="gf2" blurX="0" blurY="0" color="0xffffff" />

<mx:HTTPService id="hts" url="http://moeten.info/maidcafe/?type=dayinfo&amp;m=api&amp;image=on"
	resultFormat="e4x" result="makePlane()" />
<mx:UIComponent id="myUI" width="100%" height="100%" />
</mx:Application>

トラックバック - http://d.hatena.ne.jp/haru-komugi/20081219/1229680927