使ったのはPapervision3D

以前、DirectXで少しやったけど、やめてた。
でもFlashで飾り程度に使えるとまあ、いいかもってことで、少しやってみた。
基本的にサンプルのHelloWorldをいじってみる。

ちなみにfcwrapとかでやってる人は、
srcの中のcomとorgフォルダをflex_sdk_2のframeworks/source
の中に置けばOK。

とりあえず、どべっとソース。
[Embed]してるのはテクスチャ。

package
{
import flash.display.*;
import flash.events.*;

import org.papervision3d.scenes.*;
import org.papervision3d.cameras.*;
import org.papervision3d.objects.*;
import org.papervision3d.materials.*;

public class main extends Sprite
{
private var container :Sprite;
private var scene     :Scene3D;
private var camera    :Camera3D;
private var sphere    :Sphere;
private var cylinder  :Cylinder;
private var plane     :DisplayObject3D;

[Embed(source='wood.jpg')] private var TexWood:Class;

public function main()
{
init3D();
addEventListener( Event.ENTER_FRAME, loop3D );
}

private function init3D():void
{
container = new Sprite();
addChild( container );
container.x = 200;
container.y = 200;

scene = new Scene3D( container );

camera = new Camera3D();
camera.sort = false;

addSphere();
addCylinder();
addPlane();
}

private function addSphere():void
{
var tx:BitmapMaterial =
new BitmapMaterial((new TexWood).bitmapData);

sphere = new Sphere(null, 400);
sphere.z = 0;
sphere.rotationX = 30;
scene.addChild( sphere );
}

private function addCylinder():void
{
var tx:BitmapMaterial =
new BitmapMaterial((new TexWood).bitmapData);

cylinder = new Cylinder(tx, 800);
cylinder.z = 0;
scene.addChild( cylinder );
}

private function addPlane():void
{
plane = new Plane(null, 3200, 2400);
plane.z = 0;
scene.addChild( plane );
}

private var i:uint = 0;
private function loop3D(event:Event):void
{
camera.hover(0, Math.cos(i * Math.PI/180),
Math.sin(i * Math.PI/180));
sphere.yaw( 10* Math.sin(i * Math.PI/180) );
i+=4;
scene.renderCamera( camera );
}
}
}

その結果がこれ。

ソース追ってけば、大体分かってしまうほど、お手軽。
3Dシーンと、カメラを用意して、3Dシーンにプリミティブ作ってaddChildし、
ENTER_FRAMEごとにloopでrenderさせるだけ。

でも、オブジェクトが同じ位置にある時の描画が変・・
camera.sort = false
にしておくと、置いた順でZ位置を決定するっぽいので、
チラついたりしないようだけど。

うーん、3Dやるには、
三次元脳にしないといけないから疲れるな~。