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

[1日1Wonderfl]4日目: 惑星なりそこない

1日1Wonderfl 4/30日目
気持ち良いカメラの動きを見つけたのでやってみた。
*  camera.target を指定すると追従してくれるのね。
*  本当はまた惑星にしたかったんだけども、
*  PointLight3D を喰える BitmapMaterial みたいなのが見つかんなかった :-(
*  用意されてる?されてない?
*  見つけれなかっただけな事を祈る。
*
*  @see http://wonderfl.kayac.com/code/6a077f5db9d55bc70381cca4d8ce75ecfb3b1e0c
*  @see http://wonderfl.kayac.com/code/9e2e17a3c37edfdfc451281d73880670293f5427
// 1日1Wonderfl 4/30日目
/**
 *  気持ち良いカメラの動きを見つけたのでやってみた。
 *  camera.target を指定すると追従してくれるのね。
 *  本当はまた惑星にしたかったんだけども、
 *  PointLight3D を喰える BitmapMaterial みたいなのが見つかんなかった :-(
 *  用意されてる?されてない?
 *  見つけれなかっただけな事を祈る。
 *
 *  @see http://wonderfl.kayac.com/code/6a077f5db9d55bc70381cca4d8ce75ecfb3b1e0c
 *  @see http://wonderfl.kayac.com/code/9e2e17a3c37edfdfc451281d73880670293f5427
 */
package
{
    import flash.display.Sprite;
    //import flash.display.StageAlign;
    import flash.display.StageQuality;
    //import flash.display.StageScaleMode;
    import flash.events.Event;

    import com.flashdynamix.utils.SWFProfiler;

    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.lights.PointLight3D;
    import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;

    [SWF(width=465, height=465, frameRate=30, backgroundColor=0x001122)]

    /**
     *  惑星へのなりそこない
     */
    public class Main extends Sprite
    {
        public static const CAMERA_DISTANCE:int = 3000;
        public static const LIGHT_DISTANCE:int = 4000;

        private var camera:Camera3D;
        private var light:PointLight3D;
        private var renderer:BasicRenderEngine;
        private var scene:Scene3D;
        private var viewport:Viewport3D;

        private var container:DisplayObject3D;

        /**
         *  コンストラクタ
         */
        public function Main()
        {
            //  なにはともあれ
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        /**
         *  初期化
         */
        private function initialize(evt:Event):void
        {
            //  後片付け
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

            //  stage の設定
            //stage.align = StageAlign.TOP_LEFT;
            stage.quality = StageQuality.MEDIUM;
            //stage.scaleMode = StageScaleMode.NO_SCALE;

            //  プロファイラ
            SWFProfiler.init(this);

            //  ココで Papervision3D を初期化
            setupPV3D();

            //  Scene のコンテナを作る
            container = new DisplayObject3D();
            scene.addChild(container);

            var material:FlatShadeMaterial,
                obj:DisplayObject3D;

            //  Material 作って
            material = new FlatShadeMaterial(light, 0xff3c3c, 0x3c0000);
            //  Sphere 作って
            obj = new Sphere(material, 1000, 32, 24);
            //  コンテナに配置
            container.addChild(obj);

            //  イベントの設定
            addEventListener(Event.ENTER_FRAME, step);
        }

        /**
         *  毎フレーム呼ばれる処理
         */
        private function step(evt:Event):void
        {
            var angleX:Number, angleY:Number;

            //  マウス位置を角度(ラジアン)に変換
            angleX = mouseX / stage.stageWidth * Math.PI * 2;
            angleY = mouseY / stage.stageHeight * Math.PI * 2;

            //  カメラ位置を更新 .2 掛けてイージングさせるよ
            camera.x += (Math.sin(angleX) * CAMERA_DISTANCE - camera.x) * .1;
            camera.z += (Math.cos(angleX) * CAMERA_DISTANCE - camera.z) * .1;
            camera.y += (Math.sin(angleY) * CAMERA_DISTANCE - camera.y) * .1;

            //  結果を反映
            renderer.renderScene(scene, camera, viewport);
        }

        /**
         *  Papervision3D の初期化
         */
        private function setupPV3D():void
        {
            //  Camera.
            camera = new Camera3D();
            camera.target = DisplayObject3D.ZERO;
            camera.zoom = 1.2;
            camera.focus = 300;
            camera.z = 0;

            //  Light.
            light = new PointLight3D();
            light.x = Math.sin(Math.PI) * LIGHT_DISTANCE;
            light.z = Math.cos(Math.PI) * LIGHT_DISTANCE;
            light.y = LIGHT_DISTANCE;

            //  Renderer.
            renderer = new BasicRenderEngine();

            //  Scene.
            scene = new Scene3D();

            //  Viewport.
            viewport = new Viewport3D(465, 465, true);
            addChild(viewport);
        }
    }
}