ちょびっとPaperVision3Dで頂点を遊んでみた。
ちょびっとPaperVision3Dで頂点を遊んでみました。
こんな感じ
http://moeten.info/flex/20081015_xmasTree/bin-release/main.html
ツリーをクリックでちょびっと動作します。
参考リンク
ソースコードはこちら
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" backgroundGradientColors="[0x666666,0x000000]" creationComplete="init()" viewSourceURL="srcview/index.html"> <mx:Script> <![CDATA[ import org.papervision3d.materials.MovieMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.materials.shadematerials.GouraudMaterial; import org.papervision3d.materials.shaders.ShadedMaterial; import org.papervision3d.materials.shaders.PhongShader; import org.papervision3d.lights.PointLight3D; import org.papervision3d.materials.shadematerials.FlatShadeMaterial; import org.papervision3d.materials.utils.MaterialsList; import org.papervision3d.objects.primitives.Cube; import caurina.transitions.Tweener; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.utils.setInterval; import org.papervision3d.cameras.Camera3D; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.materials.BitmapFileMaterial; import org.papervision3d.events.InteractiveScene3DEvent; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.core.effects.utils.BitmapClearMode; private var container:Sprite; private var viewport:Viewport3D; private var scene:Scene3D; private var camera:Camera3D; private var render:BasicRenderEngine; private var rootNode:DisplayObject3D; private var theta:Number=0; private var delayTime:Number=9; private var check:Number=0; //初期化関数 private var plane:Plane; private var planeVer:Array; private function init():void{ setScene(); setCamera(); setLight(); setTree(); setCube(); setPlane(); closePlane(); this.addEventListener(Event.ENTER_FRAME, onFrame); } // PV3Dの初期化 private function setScene():void{ container = new Sprite(); myUI.addChild(container); viewport = new Viewport3D( myUI.width , myUI.height , true , true , true , true ); myUI.addChild( viewport ); render = new BasicRenderEngine(); scene = new Scene3D(); } //カメラの作成 private var cameraTarget : DisplayObject3D; private function setCamera():void{ cameraTarget = new DisplayObject3D(); camera = new Camera3D(); camera.z = -800; camera.y = 10; camera.x = 100; } //ライトの作成 private var light:PointLight3D; private var sphere:Sphere; private var shadowCaster:ShadowCaster = new ShadowCaster( "shadow1", 0, BlendMode.NORMAL, 0.5, [new BlurFilter(8, 8, 2)]); private function setLight():void{ light= new PointLight3D(true,true); light.x = 200; light.y = 200; light.z = -400; scene.addChild( light ); shadowCaster.setType(ShadowCaster.DIRECTIONAL); } //ツリーの作成 private function setTree():void{ var mat:BitmapFileMaterial = new BitmapFileMaterial( "tree.gif" ); mat.doubleSided = true; plane = new Plane( mat , 1000 , 1000 , 2 , 4 ); plane.y = 500; camera.target = plane; planeVer = plane.geometry.vertices; plane.material.interactive = true; plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK , clickObj ); scene.addChild( plane ); } //キューブの作成 private var cube:Cube; private function setCube():void{ cube = new Cube( new MaterialsList({all: new BitmapFileMaterial( "renga.jpg" ) }), 300 , 300 , 200 ); cube.y = -60; scene.addChild( cube ); } //芝生の作成 [Embed(source="siba.jpg")]private var texture:Class; private var ground:Plane; private function setPlane():void{ var shadier:ColorTransform = new ColorTransform(0.46, 0.46, 0.46); var movie:Sprite = new Sprite(); shadowCaster.setType(ShadowCaster.DIRECTIONAL); var bmp:BitmapData = Bitmap(new texture()).bitmapData; movie.graphics.beginBitmapFill(bmp, null, true); movie.graphics.drawRect(0, 0, 512, 512); movie.graphics.endFill(); movie.transform.colorTransform = shadier; ground = new Plane( new MovieMaterial(movie,false,true,true) , 2000,2000,10,10); ground.rotationX = 90; ground.y = -240; scene.addChild( ground ); } //Planeをクローズする private function closePlane():void{ var f:int = 1; for( var cnt:int = 0 ; cnt < 5 ; cnt ++ ){ if( cnt%2 ){ f = -1; }else{ f = 1; } for( var cnt2:int = 0 ; cnt2 < 3 ; cnt2 ++ ){ Tweener.addTween(planeVer[ cnt2 * 5 + cnt ], { x:planeVer[ cnt2 * 5 + cnt ].x, y:-500 + cnt*30, z:125 * f, time:1, delay:1, transition:"easeInOutCubic"}); } } } private function openPlane():void{ var f:int = 1; for( var cnt:int = 0 ; cnt < 5 ; cnt ++ ){ if( cnt%2 ){ f = -1; }else{ f = 1; } for( var cnt2:int = 0 ; cnt2 < 3 ; cnt2 ++ ){ Tweener.addTween(planeVer[cnt2 * 5 + cnt], { x:planeVer[cnt2 * 5 + cnt].x, y:-500+250*cnt, z:0, time:2, delay:0, transition:"easeInOutCubic"}); } } } //PlaneがクリックされたらPlaneをオープンする private var opened:Boolean = false; private function clickObj(e:InteractiveScene3DEvent):void{ if( opened ){ closePlane(); opened = false; }else{ openPlane(); opened = true; } } // フレームイベント用関数 private var degree:Number = 0; private function onFrame(e:Event):void { // カメラの位置を計算 var reach:Number = 0.01; var ease:Number = 0.01; var cameraDistance:Number = 1200; degree += 0.1; light.x = 300*( Math.cos( degree ) - Math.sin( degree ) ); light.z = 300*( Math.sin( degree ) + Math.cos( degree ) ); camera.x = this.mouseX*0.5; camera.y = this.mouseY*0.5; shadowCaster.castModel( cube , light , ground ); render.renderScene(scene,camera,viewport); } ]]> </mx:Script> <mx:UIComponent id="myUI" width="100%" height="100%" /> </mx:Application>