// 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); } } } [1日1Wonderfl]4日目: 惑星なりそこない