Вернуть каналы анимации md2 с Papervision 3D в ActionScript 3? - PullRequest
0 голосов
/ 30 марта 2009

В настоящее время я работаю над анализом модели FlarToolkit / Papervision3D / Quake2, которую я успешно загрузил, текстурировал и анимировал. При этом, анимационные вызовы для меня всего лишь догадки, и пока все, что я знаю, это то, что «прыжок» и «бег» доступны. Когда я использую встроенный метод getAnimationChannels () класса MD2, он просто возвращает и массив объектов MorphChannel3D следующим образом.

// md2 - это модель, которая уже загружена и ожидает, используя для этого заданные события.

trace(_md2.getAnimationChannels()); //returns [object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D],[object MorphChannel3D]

Из того, что я видел в моих собственных поисках, это должно возвращать массив имен каналов в строковой форме. Я попытался извлечь свойства из объекта MorphChannel3D, но безуспешно для каждого (var p: * in Object);

Где я иду не так, и как я могу получить названия каналов анимации, чтобы я мог вызывать их по желанию?

Пример проекта здесь

Спасибо.

1 Ответ

0 голосов
/ 13 апреля 2009

Интересный проект.

Я немного поиграл с MD2, но запутался. Не знал, какие классы использовать и как. Я спросил парней из списка рассылки papervision, но не получил четких ответов.

Вот мой тест

package
{
    import flash.display.*;
    import flash.events.*;
    import flash.utils.*;
    import org.papervision3d.core.animation.channel.AbstractChannel3D;
    import org.papervision3d.core.animation.channel.MorphChannel3D;

    import org.papervision3d.events.AnimationEvent;
    import org.ascollada.utils.FPS;
    import org.papervision3d.cameras.*;
    import org.papervision3d.core.geom.*;
    import org.papervision3d.core.geom.renderables.*;
    import org.papervision3d.events.*;
    import org.papervision3d.materials.*;
    import org.papervision3d.materials.special.*;
    import org.papervision3d.materials.utils.*;
    import org.papervision3d.objects.*;
    import org.papervision3d.objects.parsers.*;
    import org.papervision3d.objects.primitives.*;
    import org.papervision3d.render.*;
    import org.papervision3d.scenes.*;
    import org.papervision3d.view.*;
    import org.papervision3d.view.layer.*;

    /**
    * Basic MD2Test Class
    * @author George Profenza
    */
    public class MD2Test extends Sprite
    {

        private var viewport:BasicView;
        private var timer:Timer;
        private var fps:FPS;
        private var container:DisplayObject3D;
        private var box:MD2;
        private var isPlaying:Boolean = true;
        private var _channels:Array;
        private var _numFrames:int;
        private var _currentFrame:int;
        private var frameCount:int = 1;

        public function MD2Test() 
        {
            init();
        }

        private function init():void {

            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.SHOW_ALL;

            viewport = new BasicView(0, 0, true, true, CameraType.FREE);
            addChild(viewport);

            container = new DisplayObject3D();
            viewport.scene.addChild(container);

            fps = new FPS();
            addChild(fps);

            var mat:WireframeMaterial = new WireframeMaterial(0x990000);
            mat.doubleSided = true;

            box = new MD2(false);
            box.rotationX = -90;
            box.load("animations/box_wrap_anim.md2", mat, 6, 10);
            box.addEventListener(FileLoadEvent.LOAD_COMPLETE, boxLoaded);
            box.addEventListener(AnimationEvent.ANIMATION_NEXT_FRAME, boxAnimationComplete);
            container.addChild(box);

            //var channel:AnimationCha = new MorphChannel3D(box);

            var btnPlay:Sprite = new Sprite();
            btnPlay.graphics.beginFill(0x990000);
            btnPlay.graphics.drawRect(0, 0, 60, 20);
            btnPlay.graphics.endFill();
            addChild(btnPlay);
            btnPlay.y = 100;
            btnPlay.addEventListener(MouseEvent.CLICK, playMD2);

            var btnNextFrame:Sprite = new Sprite();
            btnNextFrame.graphics.beginFill(0x990000);
            btnNextFrame.graphics.drawRect(0, 0, 60, 20);
            btnNextFrame.graphics.endFill();
            addChild(btnNextFrame);
            btnNextFrame.y = 200;
            btnNextFrame.addEventListener(MouseEvent.CLICK, playNextFrame);

            addEventListener(Event.ENTER_FRAME, render);
        }

        private function boxAnimationComplete(e:AnimationEvent):void 
        {
            trace('box animation complete');
        }

        private function playNextFrame(e:MouseEvent):void 
        {
            if (frameCount < _numFrames) frameCount++;
            else frameCount = frameCount;
            gotoFrame(frameCount);
        }

        private function boxLoaded(e:FileLoadEvent):void 
        {
            _channels = box.getAnimationChannels();

           trace("channel count", _channels.length);
           rewind();

           _numFrames = 0;
           _currentFrame = 1;

           for each(var channel:AbstractChannel3D in _channels)
           {
               _numFrames = Math.max(_numFrames, channel.keyFrames.length);
               channel.updateToFrame(_currentFrame);
           }
        }

        public function rewind():void
       {
           trace("channels length: " + box.getAnimationChannels().length);
           for each(var channel:AbstractChannel3D in _channels)
           {
               channel.updateToFrame(1);
           }
       }

       public function gotoFrame(frame:Number):void
       {
           for each(var channel:AbstractChannel3D in _channels)
               channel.updateToFrame(frame);
       }


        private function playMD2(e:MouseEvent):void 
        {
            isPlaying = !isPlaying;
            isPlaying ? box.stop() : box.play();
        }

        private function render(e:Event):void 
        {
            viewport.camera.orbit(mouseY * .5, mouseX * .5);
            viewport.singleRender();
        }

    }

}

Это было создано несколько месяцев назад, поэтому стоит проверить обновления. В моем тесте все делается немного вручную. Я помню несколько хороших демонстраций на веб-сайте ascollada , но у меня никогда не было возможности увидеть, как они реализовали анимацию md2.

Надеюсь, это поможет.

...