Flashで使える3Dゲームエンジン「yogurt3d」

0


20100329-01
yogurt3d」は3Dゲームの開発に使えるActionscript3.0ライブラリです。

Maya、 XSI Softimage、 3D Studio Maxなどの3D作成ソフトと連携が取れるようです。

詳しくは以下

デモ

サイト内にはタワーディフェンスや、キャラクターをキーボードで操作できるデモがあります。
以下はタワーディフェンスの様子。普通に遊べます。

20100329-02

単純な3Dの描画は以下のようなコードで実装できるようです。

package
{
    import com.yogurt3d.Yogurt3D;
    import com.yogurt3d.core.materials.MaterialBitmap;
    import com.yogurt3d.core.sceneobjects.SceneObjectRenderable;
    import com.yogurt3d.presets.primitives.sceneobjects.BoxSceneObject;
    import com.yogurt3d.presets.renderers.trianglesort.RendererTriangleSort;  

    import flash.display.GraphicsSolidFill;
    import flash.display.Sprite;
    import flash.events.KeyboardEvent;
    import flash.events.MouseEvent;
    import flash.geom.Vector3D;  

    import mx.core.BitmapAsset;  

    import utils.*;  

    [SWF(width='800',height='600',frameRate='60',backgroundColor='0x000000')]
    public class Tutorial1 extends Sprite
    {
        [Embed(source="../resources/yogurt.png")]
        private var m_embeddedTexture:Class;
        private var m_texture:BitmapAsset = new m_embeddedTexture() as BitmapAsset;  

        public var ko:KeyObject;  

        private var m_mouseDown:Boolean = false;
        private var mousePosX:Number=0,mousePosY:Number=0,mousePosX_prev:Number=0,mousePosY_prev:Number=0;  

        private var renderableObject:SceneObjectRenderable;  

        private var angleX:Number       = 0;
        private var angleY:Number       = 0;
        private var rot_speed:Number    = 0.5;  

        public function Tutorial1()
        {
            KeyObject.stage = this.stage;
            ko = new KeyObject(this);  

            Yogurt3D.defaultSetup();
            Yogurt3D.fps = stage.frameRate;  

            stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseUpDownEventListener);
            stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveEventListener);
            stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpDownEventListener);
            stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelEventListener);  

            Yogurt3D.defaultContext.renderer = new RendererTriangleSort();
            Yogurt3D.defaultCamera.setProjectionPerspective(50.0, 800.0/600.0, 1, 400 );
            Yogurt3D.defaultViewport.setViewport( 0.0, 0.0, 800.0, 600.0 );
            Yogurt3D.defaultCamera.transformation.positionWrtParent = new Vector3D(0, 0, 20);  

            addChild(Yogurt3D.defaultViewport);  

            Yogurt3D.enginePreUpdateCallback = run;  

            renderableObject = new BoxSceneObject(5,5,8,2,3,4);  

            renderableObject.material = new MaterialBitmap(m_texture.bitmapData);  

            renderableObject.material.graphicsStroke.thickness = 1;
            renderableObject.material.graphicsStroke.fill = new GraphicsSolidFill(0xFFFFFF);  

            Yogurt3D.defaultScene.addChild(renderableObject);  

            Yogurt3D.startAutoUpdate();
        }  

        public function run():void
        {
            if(ko.keysDown[87])//W
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, -1);
            }  

            if(ko.keysDown[65])//A
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.xAxisWrtParent, -1);
            }  

            if(ko.keysDown[83])//S
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, 1);
            }  

            if(ko.keysDown[68])//D
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.xAxisWrtParent, 1);
            }  

            if(ko.keysDown[32])//SPACE
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.yAxisWrtParent, 1);
            }  

            if(ko.keysDown[16])//SHIFT
            {
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.yAxisWrtParent, -1);
            }
        }  

        private function mouseUpDownEventListener(_e:MouseEvent):void
        {
            m_mouseDown = _e.buttonDown;
        }  

        private function mouseMoveEventListener(_e:MouseEvent):void
        {
            mousePosX_prev = mousePosX;
            mousePosY_prev = mousePosY;
            mousePosX = Yogurt3D.defaultViewport.mouseX;
            mousePosY = Yogurt3D.defaultViewport.mouseY;  

            if (m_mouseDown)
            {
                angleX += rot_speed*(mousePosY_prev-mousePosY);
                angleY += rot_speed*(mousePosX_prev-mousePosX);
                if(angleX > 90)
                    angleX = 90;
                if(angleX < -90)
                    angleX = -90;  

                Yogurt3D.defaultCamera.transformation.resetRotation();  

                Yogurt3D.defaultCamera.transformation.rotateYWrtWorld(angleY);
                Yogurt3D.defaultCamera.transformation.rotateXWrtObject(angleX);
            }
        }  

        private function mouseWheelEventListener(_e:MouseEvent):void
        {
            Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, -_e.delta/5);
        }  

        public function keyPressed(evt:KeyboardEvent):void
        {
            ko.keysDown[evt.keyCode] = true;
        }  

        public function keyReleased(evt:KeyboardEvent):void
        {
            delete ko.keysDown[evt.keyCode];
        }
    }
}

3Dゲームにチャレンジしてみたい方はいかがでしょうか。


Post a comment