[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);
}
}
}