Papervision3Dで頂点を遊ぶ
まずはこちらのサイト
TweenerでPapervision3Dのオブジェクトを生きている様に拡大・縮小する
こちらを見て、わー面白いってことで自分でも遊びでやってみました。
こんな感じ
http://moeten.info/flex/20080920_pv3d2Test/bin-release/main3.html
ソースはこちらmain3.mxmlってファイル
マウスイベント取得するのってちょっと手間がいるんですね。
こんな感じ
Mouse3D.enabled = true; plane.material.interactive = true; plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj ); private function clickObj (e:InteractiveScene3DEvent):void { var p:Plane = e.displayObject3D as Plane; var a:Mouse3D = r.viewport.interactiveSceneManager.mouse3D; }
頂点遊びっていろいろ変形できるから楽しいですね。
ほかにもTwistってのがあるのでこれもまた今度遊びでやってみたい。
参考リンク
頂点座標で遊ぶ main3.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundAlpha="1" backgroundColor="0x000000" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import org.papervision3d.events.*; import org.papervision3d.core.utils.Mouse3D; import caurina.transitions.Tweener; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.materials.BitmapColorMaterial; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.core.material.TriangleMaterial; import org.papervision3d.core.effects.view.ReflectionView; private var cameraTarget : DisplayObject3D; //初期化 private function init():void{ Mouse3D.enabled = true; setupScene(); // setupSphere(); setupListeners(); setupCamera(); // setfog(); hts.send(); // setupBlokjes(); } private function onResult():void{ setupBlokjes(); } //シーンの作成+リフレクション private var r:ReflectionView; private function setupScene():void{ r = new ReflectionView( myImage.width , myImage.height , true , true ); //リフレクションを置く場所 r.surfaceHeight = -600; //ぼかし具合 r.viewportReflection.filters = [new BlurFilter(8, 8, 1)]; //色の変更 //setReflectionColor(0, 50, 0, 0, 50, 0); myImage.addChildAt( r , 0 ); } //カメラ設定 private function setupCamera():void{ cameraTarget = new DisplayObject3D(); //なんかないと怒られる r.camera.z = - 800; r.camera.y = 10; } //イベントリスナー設定 private function setupListeners():void{ addEventListener(Event.ENTER_FRAME, onRenderTick); addEventListener(Event.RESIZE, onResize); } //オブジェ(キューブ)の作成 private var cubeArr:Array = new Array(); private function setupBlokjes() : void { var size:Number = 100; var spacing:Number = 10; var rowNum:Number = 5; var xCubes:Number = hts.lastResult.item.length() / rowNum -1 ; var yCubes:Number = rowNum; var plane:Plane; var cWidth:Number = ((xCubes-1) * size) + ((xCubes-1) * spacing); var xOffest:Number = cWidth / 2; var cHeight:Number = ((yCubes-1) * size) + ((yCubes-1) * spacing); var yOffest:Number = cHeight / 2; var cnt:int = 0; for(var y:int = 0 ; y < yCubes ; y++){ for(var x:int = 0 ; x < xCubes ; x++){ var mat:BitmapFileMaterial = new BitmapFileMaterial( hts.lastResult.item[cnt].image.image1 ); mat.doubleSided = true; plane = new Plane( mat , size , size ); plane.x = (x * size) + (x * (spacing - 1)) - xOffest; plane.y = (y * size) + (y * (spacing - 1)) - yOffest; //ここ重要 plane.material.interactive = true; cubeArr.push( plane ); //シーンにオブジェクトを追加 r.scene.addChild(plane); plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj ); cnt++; } } } //オブジェクトクリックイベント private function clickObj (e:InteractiveScene3DEvent):void { var p:Plane = e.displayObject3D as Plane; var a:Mouse3D = r.viewport.interactiveSceneManager.mouse3D; Tweener.addTween( p ,{ z :p.z-100 + Math.random() * 100, time:1, transition:"easeInOutElastic" }); //頂点取り出し for each(var i:* in e.target.geometry.vertices ) { Tweener.addTween(i, { x:i.x*2, y:i.y*2, z:i.z*2, time:1, delay:Math.random(), transition:"easeInOutElastic" }); } } //レンダリング+マウス操作 protected function onRenderTick(e:Event):void { var reach:Number = 0.005; var ease:Number = 0.05; var cameraDistance:Number = 1000; //カメラワーク r.camera.x += (Math.sin(mouseX * reach) * -cameraDistance - r.camera.x) * ease/40; // r.camera.z += (Math.cos(mouseX * reach) * - cameraDistance - r.camera.z) * ease/50; if( this.mouseY > this.height/2 ){ r.camera.y -= (Math.sin(this.mouseY * reach) * cameraDistance + r.camera.y) * ease/40; }else{ r.camera.y += (Math.sin(this.mouseY * reach) * cameraDistance + r.camera.y) * ease/40; } r.camera.lookAt(cameraTarget); //レンダリング r.singleRender(); } //リサイズイベント private function onResize(e : Event) : void { } ]]> </mx:Script> <mx:HTTPService id="hts" url="http://moeten.info/maidcafe/?type=baito&m=api&tid=13" result="onResult()" resultFormat="e4x"/> <mx:Image id="myImage" width="100%" height="100%" /> </mx:Application>