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