Flashの3D表現ライブラリの1つである、Alternativa3Dに手を出してみました。
使ってるバージョンは7.5です。
今回は、Planeの頂点にアクセスしました。
サンプルはこんな感じです。
ほとんどPV3Dのときと同じ方法で出来ました。
以下、今回のメモ。
- 「for each (var obj:Vertex in plane.vertices)」で頂点にアクセス。
- PV3Dとほぼ同じ。
以下ソースです。
package
{
import alternativa.engine3d.core.Camera3D;
import alternativa.engine3d.core.Object3DContainer;
import alternativa.engine3d.core.Vertex;
import alternativa.engine3d.core.View;
import alternativa.engine3d.materials.TextureMaterial;
import alternativa.engine3d.primitives.Plane;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
[SWF(backgroundColor=0x000000)]
public class Main extends Sprite
{
[Embed(source='image.jpg')]
private var img:Class;
private static const RADIAN:Number = Math.PI/180;
private var rootContainer:Object3DContainer;
private var camera:Camera3D;
private var view:View;
private var plane:Plane;
private var theta:Number;
public function Main()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.LOW;
stage.frameRate = 30;
// ベースとなるコンテナ。
rootContainer = new Object3DContainer();
// カメラの初期化 (PV3Dでいうフリーカメラみたいなの)。
camera = rootContainer.addChild(new Camera3D) as Camera3D;
camera.z = -1200;
camera.x = camera.y = 0;
// ビューポート (View is DisplayObject)
view = new View(stage.stageWidth, stage.stageHeight);
view.logoAlign = StageAlign.TOP_LEFT;
view.logoHorizontalMargin = 80;
camera.view = addChild(view) as View;
// デバッグ情報を表示する場合は記述
camera.diagramAlign = StageAlign.TOP_LEFT;
addChild(camera.diagram);
// Planeを配置
theta = 0;
var texture:BitmapData = (new img as Bitmap).bitmapData;
var mat:TextureMaterial = new TextureMaterial(texture, false, true);
plane = rootContainer.addChild(new Plane(texture.width*2, texture.height*2,15,15,true)) as Plane;
plane.setMaterialToAllFaces(mat);
addEventListener(Event.ENTER_FRAME, onFrame);
stage.addEventListener(Event.RESIZE, onResize);
}
private function onResize(e:Event):void
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}
private function onFrame(e:Event):void
{
var s:int=0;
var c:int=0;
// 頂点を制御して、サインカーブを適用
for each (var obj:Vertex in plane.vertices)
{
obj.z=80 * Math.sin((theta + s) * Math.PI / 180);
c++;
if (c % 15 == 0) s+=20;
}
theta+=15;
plane.rotationX+=RADIAN;
plane.rotationY+=RADIAN;
// レンダリング
camera.render();
}
}
}
