代码之家  ›  专栏  ›  技术社区  ›  Brian Hodge

用ActionScript3中的PaperVision3D返回MD2的动画频道?

  •  0
  • Brian Hodge  · 技术社区  · 17 年前

    我目前正在进行flartoolkit/papervision3d/quake2模型解析,我已经成功地加载了该模型,并对其进行了纹理和动画处理。也就是说,动画电话对我来说只是一个猜测,到目前为止,我只知道“跳跃”和“奔跑”是可用的。当我使用md2类的内置getAnimationChannels()时,它只返回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对象中提取属性,但没有成功地使用for each(var p:*in object);

    我哪里出错了,我怎么能得到动画频道的名称,以便我可以随意调用它们?

    Example of the project here

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  0
  •   George Profenza    17 年前

    有趣的项目。

    我有点玩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();
            }
    
        }
    
    }
    

    这是几个月前创建的,因此在检查更新时可能值得。在我的测试中,有些事情是手动完成的。我记得看到一些不错的演示 the ascollada website ,但从未有机会看到他们如何实现md2动画。

    希望这有帮助。

    推荐文章