※現在、「wonderfl build flash online」求人コンテンツ制作に関してのアンケートを実施中です!みなさまのお力添えを頂いて、続々とアンケート結果が集まっていますが、まだまだ募集しております。ご協力のほど、どうぞよろしくお願いいたします!

wonderfl運営事務局
→アンケートページ(※ログインしてからお答えいただけるようになっています。)

 notice: Flash editor updated! Join the development! Thanks to MiniBuilder


FAVORITE BY
:
pv3dカメラの動きが気持ち良い
:
火星
FORKED

[1日1Wonderfl]4日目: 惑星なりそこない [1日1Wonderfl]5日目: 惑星っぽくなってきた [diff(193)]

  1. // forked from soundkitchen's [1日1Wonderfl]4日目: 惑星なりそこない
  2. // 1日1Wonderfl 5/30日目
  3. /**
  4.  *  とりあえず惑星にしてみた。
  5.  *  質量の計算をまるっと抜かしてるので色々と物足りない。
  6.  *  あと、ぼつぼつコードに明らさまに汚ない部分が見え始めたので、
  7.  *  そこらへんを簡潔に書けるように試行錯誤していく。
  8.  *
  9.  *  前回 ColorMatrixFilter を使って BitmapData の色を変更していたのを
  10.  *  今回は ColorTransform 使ってみた。が、
  11.  *  どちらの方がコスト的に良いのかは未調査。近々テストしてみる。
  12.  *
  13.  *  frocessing に入ってる ColorHSV はものっそいツボ。
  14.  *  frocessing.color パッケージに入ってるのは全部良い感じ。な気がする。
  15.  */
  16. package
  17. {
  18.     import flash.display.BitmapData;
  19.     import flash.display.BitmapDataChannel;
  20.     import flash.display.Sprite;
  21.     import flash.display.StageAlign;
  22.     import flash.display.StageQuality;
  23.     import flash.display.StageScaleMode;
  24.     import flash.events.Event;
  25.     import flash.filters.GlowFilter;
  26.     import flash.geom.ColorTransform;
  27.     import com.flashdynamix.utils.SWFProfiler;
  28.     import frocessing.color.ColorHSV;
  29.     import org.papervision3d.cameras.Camera3D;
  30.     import org.papervision3d.core.data.UserData;
  31.     import org.papervision3d.materials.BitmapMaterial;
  32.     import org.papervision3d.materials.special.ParticleMaterial;
  33.     import org.papervision3d.objects.DisplayObject3D;
  34.     import org.papervision3d.objects.primitives.Sphere;
  35.     import org.papervision3d.objects.special.ParticleField;
  36.     import org.papervision3d.render.BasicRenderEngine;
  37.     import org.papervision3d.scenes.Scene3D;
  38.     import org.papervision3d.view.Viewport3D;
  39.     [SWF(width=465, height=465, frameRate=30, backgroundColor=0x000000)]
  40.     /**
  41.      *  document class.
  42.      */
  43.     public class Main extends Sprite
  44.     {
  45.         public static const NUM_PLANETS:uint = 6;
  46.         public static const CAMERA_DISTANCE:uint = 2000;
  47.         private var camera:Camera3D;
  48.         private var renderer:BasicRenderEngine;
  49.         private var scene:Scene3D;
  50.         private var viewport:Viewport3D;
  51.         private var root3d:DisplayObject3D;
  52.         private var sun:Sphere;
  53.         private var planets:Vector.<DisplayObject3D>;
  54.         public function Main()
  55.         {
  56.             addEventListener(Event.ADDED_TO_STAGE, initialize);
  57.         }
  58.         private function initialize(evt:Event):void
  59.         {
  60.             removeEventListener(Event.ADDED_TO_STAGE, initialize);
  61.             //  setup stage.
  62.             stage.align = StageAlign.TOP_LEFT;
  63.             stage.quality = StageQuality.HIGH;
  64.             stage.scaleMode = StageScaleMode.NO_SCALE;
  65.             //  set profiler.
  66.             SWFProfiler.init(this);
  67.             //  setup pv3d.
  68.             setupPV3D();
  69.             //  create background particle field.
  70.             createBackground();
  71.             //  create sun object.
  72.             createSun();
  73.             //  create planet object(s).
  74.             createPlanets();
  75.             addEventListener(Event.ENTER_FRAME, step);
  76.         }
  77.         /**
  78.          *  setup papervision3d.
  79.          */
  80.         private function setupPV3D():void
  81.         {
  82.             //  camera.
  83.             camera = new Camera3D();
  84.             camera.zoom = 1.5;
  85.             camera.focus = 200;
  86.             camera.target = DisplayObject3D.ZERO;
  87.             //  renderer.
  88.             renderer = new BasicRenderEngine();
  89.             //  scene.
  90.             scene = new Scene3D();
  91.             //  viewport.
  92.             viewport = new Viewport3D(465465true);
  93.             addChild(viewport);
  94.             //  create root container object.
  95.             root3d = new DisplayObject3D();
  96.             scene.addChild(root3d);
  97.         }
  98.         /**
  99.          *  create background particle field.
  100.          */
  101.         private function createBackground():void
  102.         {
  103.             var mat:ParticleMaterial,
  104.                 obj:ParticleField;
  105.             mat = new ParticleMaterial(0xa8a8a8, .7, ParticleMaterial.SHAPE_CIRCLE);
  106.             obj = new ParticleField(mat, 5004400040004000);
  107.             root3d.addChild(obj);
  108.         }
  109.         /**
  110.          *  create sphere object as sun.
  111.          */
  112.         private function createSun():void
  113.         {
  114.             var bmd:BitmapData,
  115.                 mat:BitmapMaterial;
  116.             bmd = new BitmapData(465465true0);
  117.             bmd.perlinNoise(465/8465/8810truetrue, BitmapDataChannel.RED);
  118.             mat = new BitmapMaterial(bmd);
  119.             sun = new Sphere(mat, 8003224);
  120.             sun.useOwnContainer = true;
  121.             sun.filters = [
  122.                 new GlowFilter(0xff0000, .664642),
  123.             ];
  124.             root3d.addChild(sun);
  125.         }
  126.         /**
  127.          *  create sphere object as planet(s).
  128.          */
  129.         private function createPlanets():void
  130.         {
  131.             var i:uint,
  132.                 s:Number,
  133.                 angle:Number,
  134.                 distance:Number,
  135.                 src:BitmapData,
  136.                 bmd:BitmapData,
  137.                 mat:BitmapMaterial,
  138.                 wrapper:DisplayObject3D,
  139.                 obj:Sphere,
  140.                 hsv:ColorHSV;
  141.             s = 100;
  142.             src = new BitmapData(s, s, true0);
  143.             src.perlinNoise(s/8, s/8820truetrue, BitmapDataChannel.RED, true);
  144.             hsv = new ColorHSV(0111);
  145.             planets = new Vector.<DisplayObject3D>(NUM_PLANETS, true);
  146.             for (i=0; i<NUM_PLANETS; i++)
  147.             {
  148.                 angle = Math.random() * Math.PI * 2;
  149.                 distance = Math.random() * 2000 + 1000;
  150.                 hsv.h = angle / Math.PI * 180;
  151.                 bmd = src.clone();
  152.                 bmd.colorTransform(bmd.rect, new ColorTransform(hsv.r/0xff, hsv.g/0xff, hsv.b/0xff, hsv.a, 0000));
  153.                 mat = new BitmapMaterial(bmd);
  154.                 obj = new Sphere(mat, 100129);
  155.                 obj.x = Math.cos(angle) * distance;
  156.                 obj.z = Math.sin(angle) * distance;
  157.                 obj.useOwnContainer = true;
  158.                 obj.filters = [
  159.                     new GlowFilter(hsv.value, .616162),
  160.                 ];
  161.                 //  TODO: fix this poor logic.
  162.                 obj.userData = new UserData({
  163.                     'accel': (3000 - distance) / 2500
  164.                 });
  165.                 wrapper = new DisplayObject3D();
  166.                 wrapper.addChild(obj);
  167.                 root3d.addChild(wrapper);
  168.                 planets[i] = obj;
  169.             }
  170.         }
  171.         /**
  172.          *  will execute triggered enter frame event.
  173.          */
  174.         private function step(evt:Event):void
  175.         {
  176.             var angleX:Number, angleY:Number,
  177.                 accel:Number,
  178.                 obj:DisplayObject3D;
  179.             angleX = (mouseX / stage.stageWidth) * Math.PI * 2;
  180.             angleY = (mouseY / stage.stageHeight) * Math.PI * 2;
  181.             //  TODO: fix this poor code.
  182.             sun.rotationY -= .5;
  183.             for each (obj in planets)
  184.             {
  185.                 accel = obj.userData.data['accel'];
  186.                 obj.rotationY -= 2 * accel;
  187.                 DisplayObject3D(obj.parent).rotationY -= 1 * accel;
  188.             }
  189.             camera.x += (Math.sin(angleX) * CAMERA_DISTANCE - camera.x) * .2;
  190.             camera.z += (Math.cos(angleX) * CAMERA_DISTANCE - camera.z) * .2;
  191.             camera.y += (Math.sin(angleY) * CAMERA_DISTANCE - camera.y) * .2;
  192.             renderer.renderScene(scene, camera, viewport);
  193.         }
  194.     }
  195. }
noswf
Get Adobe Flash Player