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]1日目: Papervision3D でボールまみれ

1日1Wonderfl 1/30日目
// 1日1Wonderfl 1/30日目
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.ColorMaterial;
    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=0xffffff)]

    /**
     *  最近のトレンドが FLARToolKit になりつつあるので、
     *  そこに向かうために、とりあえずは Papervision3D を、
     *  無駄なく無理なく軽いタッチで使えるようになりたい。
     */
    public class Main extends Sprite
    {
        public static const NUM_SPHERES:uint = 30;

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

        private var root3d:DisplayObject3D;

        /**
         *  コンストラクタ
         */
        public function Main()
        {
            //  ステージ上で会いましょう
            addEventListener(Event.ADDED_TO_STAGE, initialize);
        }

        /**
         *  オブジェクトの初期化
         */
        private function initialize(evt:Event):void
        {
            //  要らなくなったイベントは外す
            removeEventListener(Event.ADDED_TO_STAGE, initialize);

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

            //  SWFProfiler 仕込む
            SWFProfiler.init(this);

            //  Papervision3D の初期化
            setupPV3D();

            //  root の Papervision3D 版みたいなノリ
            root3d = new DisplayObject3D();
            scene.addChild(root3d, 'root');

            var l:uint,
                r:int, g:int, b:int,
                hc:uint, dc:uint,
                material:FlatShadeMaterial,
                sphere:Sphere;

            //  指定個数だけボールを作る
            l = NUM_SPHERES;
            while (l--)
            {
                //  適当に色を作ります
                r = 0xff * Math.random();
                g = 0xff * Math.random();
                b = 0xff * Math.random();
                //  それぞれを合わせて明るい色を作る
                hc = r << 16|g << 8|b;
                //  減色して暗い色を作る
                dc = (r * .6) << 16|(g * .6) << 8|(b * .6);
                //  ボールを作って
                material = new FlatShadeMaterial(light, hc, dc);
                sphere = new Sphere(material, 80, 12, 9);
                //  適当な位置を決めて
                sphere.x = Math.random() * 2000 - 1000;
                sphere.y = Math.random() * 2000 - 1000;
                sphere.z = Math.random() * 2000 - 1000;
                //  配置する
                root3d.addChild(sphere);
            }

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

        /**
         *  毎フレーム呼ばれる処理
         */
        private function step(evt:Event):void
        {
            //  X 軸を軸として回す
            //root3d.pitch(-1);
            //  Y 軸を軸として回す
            root3d.yaw(-1);
            //  Z 軸を軸として回す
            //root3d.roll(-1);

            //  ココで書き出し
            //  scene を camera で viewport なフィルムに撮る。そんな感じ
            renderer.renderScene(scene, camera, viewport);
        }

        /**
         *  Papervision3D の初期化。 BasicView はココをやってくれてる
         */
        private function setupPV3D():void
        {
            //  Camera3D
            //  デフォルトの位置は x=0 y=0 z=-1000
            camera = new Camera3D();

            //  PointLight3D
            //  デフォルトの位置は x=0 y=0 z=-1000
            light = new PointLight3D();
            //  上に移動
            light.y = 1000;

            //  BasicRenderEngine
            renderer = new BasicRenderEngine();

            //  Scene3D
            scene = new Scene3D();

            //  Viewport3D
            //  x=465 y=465 resizable=true に設定
            viewport = new Viewport3D(465, 465, true);
            addChild(viewport);
        }
    }
}