そろそろ3Dでもやるか - しろログ

そろそろ3Dでもやるか

2007/05/25

使ったのは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やるには、
三次元脳にしないといけないから疲れるな~。

カテゴリ:コンピューター

タグ:, ,

トラックバックURI

http://blog.hakoniwa.net/archives/299/trackback/

コメント・ご質問

2007/07/22 15:47 shiroiwaさん

Papervision3D 1.5 (AS3) 公式リリース。
http://blog.papervision3d.org/2007/07/20/papervision3d-15-as3-official-release/




コメント・ご質問


※スパム防止のため、表示まで時間がかかることがあります。