Twilight ゼルダトワプリっぽいのが作りたかった。 osamX forked:0favorite:3lines:82license : MIT License modified : 2009-06-20 04:42:42 Embed Tweet /* ゼルダトワプリっぽいのが作りたかった。 */ package { import flash.display.Sprite; import flash.events.Event; import flash.filters.BlurFilter; import org.papervision3d.cameras.Camera3D; import org.papervision3d.core.math.Plane3D; import org.papervision3d.materials.ColorMaterial; 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(width="465", height="465", frameRate="30", backgroundColor="0xffffff")] public class Twilight extends Sprite { private var viewport:Viewport3D; private var scene:Scene3D; private var camera:Camera3D; private var renderer:BasicRenderEngine; private const PLANE_NUM:Number = 128; //Planeの個数 private var planeArray:Array = new Array(PLANE_NUM); private var speedArray:Array = new Array(PLANE_NUM); /* コンストラクタ */ public function Twilight():void { initPV3D(); var material:ColorMaterial = new ColorMaterial( 0x000000 ); material.oneSide = false; //両面 material.fillAlpha = 0.7; //透明度 for (var i:int = 0; i < PLANE_NUM; i++ ) { planeArray[i] = createPlane( material ); //Planeを作る speedArray[i] = 10 * Math.random() + 2; //PlaneのSpeed決定 } addEventListener(Event.ENTER_FRAME, onEnterFrame); } /* EnterFrame */ private function onEnterFrame( event:Event ):void { var blur:Number; var cameraRotation: Number = 360 * stage.mouseX / stage.width; for (var i:int = 0; i < PLANE_NUM; i++ ) { var obj:Plane = planeArray[i] as Plane; obj.rotationY += speedArray[i] * 0.7; obj.y = ( planeArray[i].y + speedArray[i] * 0.5 ) % 2000; blur = getDistance(obj.x, obj.y, obj.z) / 50; obj.filters = [new BlurFilter(blur, blur, 2)]; } camera.y = 500; camera.x = 500 * Math.cos( 2 * Math.PI * cameraRotation / 360 ); camera.z = 500 * Math.sin( 2 * Math.PI * cameraRotation / 360 ); camera.localRotationY = cameraRotation + 90; renderer.renderScene( scene, camera, viewport ); } /* Planeを作る */ private function createPlane( material:ColorMaterial ):Plane { var size:Number = 20 * Math.random() + 20; var plane:Plane = new Plane(material, size, size); plane.x = 1000 * Math.random() - 500; plane.y = 2000 * Math.random(); plane.z = 1000 * Math.random() - 500; plane.rotationY = 360 * Math.random(); plane.useOwnContainer = true; scene.addChild(plane); return plane; } /* カメラからの距離計算 */ private function getDistance(_x:Number, _y:Number,_z:Number):Number { var tmp:Number = 0; tmp = (_x - camera.x) * (_x - camera.x); tmp += (_y - camera.y) * (_y - camera.y); tmp += (_z - camera.z) * (_z - camera.z); return Math.abs(Math.sqrt(tmp) - 500); } /* いろいろ初期化 */ private function initPV3D():void { viewport = new Viewport3D(465,465); scene = new Scene3D(); camera = new Camera3D(); renderer = new BasicRenderEngine(); addChild(viewport);viewport = new Viewport3D(); scene = new Scene3D(); camera = new Camera3D(); renderer = new BasicRenderEngine(); addChild(viewport); } } } Code Fullscreen Preview Fullscreen bradsedito zakky siouxcitizen.. PV3D viewport material scene BasicRenderEngine Viewport3D localRotationY useOwnContainer fillAlpha oneSide rotationY renderScene filters mouseX width Math.abs Math.sqrt Math.PI addEventListener Math.cos Array