Actionscript 3 返回md2';在actionscript 3中使用Papervision 3D制作动画频道?

Actionscript 3 返回md2';在actionscript 3中使用Papervision 3D制作动画频道?,actionscript-3,papervision3d,Actionscript 3,Papervision3d,我目前正在开发FlarToolkit/Papervision3D/Quake2模型解析,已成功加载、制作纹理和动画。也就是说,动画调用对我来说只是一个猜测,到目前为止,我所知道的只是“跳跃”和“奔跑”是可用的。当我使用MD2类的内置getAnimationChannels()时,它只返回和数组MorphChannel3D对象,如下所示 //md2是一个已经加载的模型,它正在利用给定的事件等待这样的事件 trace(_md2.getAnimationChannels()); //returns [

我目前正在开发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)

我哪里出错了?我如何获得动画频道的名称,以便可以随意调用它们

谢谢。

有趣的项目

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

    }

}
包
{
导入flash.display.*;
导入flash.events.*;
导入flash.utils。*;
导入org.papervision3d.core.animation.channel.AbstractChannel3D;
导入org.papervision3d.core.animation.channel.MorphChannel3D;
导入org.papervision3d.events.AnimationEvent;
导入org.ascollada.utils.FPS;
导入org.papervision3d.cameras.*;
导入org.papervision3d.core.geom.*;
导入org.papervision3d.core.geom.renderables.*;
导入org.papervision3d.events.*;
导入org.papervision3d.materials.*;
导入org.papervision3d.materials.special.*;
导入org.papervision3d.materials.utils.*;
导入org.papervision3d.objects.*;
导入org.papervision3d.objects.parsers.*;
导入org.papervision3d.objects.primitives.*;
导入org.papervision3d.render.*;
导入org.papervision3d.scenes.*;
导入org.papervision3d.view.*;
导入org.papervision3d.view.layer.*;
/**
*基本MD2测试类
*@作者乔治·普洛芬扎
*/
公共类MD2Test扩展了Sprite
{
私有变量视口:基本视图;
专用变量定时器:定时器;
私人var fps:fps;
私有var容器:DisplayObject3D;
专用var箱:MD2;
私有变量显示:布尔值=true;
专用var_通道:阵列;
私有变量numFrames:int;
私有变量currentFrame:int;
私有变量frameCount:int=1;
公共函数MD2Test()
{
init();
}
私有函数init():void{
stage.align=StageAlign.TOP\u左;
stage.scaleMode=StageScaleMode.SHOW_ALL;
viewport=新的基本视图(0,0,true,true,CameraType.FREE);
addChild(视口);
容器=新的DisplayObject3D();
viewport.scene.addChild(容器);
fps=新的fps();
addChild(fps);
var mat:线框材质=新线框材质(0x990000);
mat.doubleside=true;
框=新MD2(假);
box.rotationX=-90;
加载(“动画/box\u wrap\u anim.md2”,mat,6,10);
box.addEventListener(FileLoadEvent.LOAD_COMPLETE,boxLoaded);
box.addEventListener(AnimationEvent.ANIMATION\u下一帧,boxAnimationComplete);
容器.addChild(box);
//变量通道:AnimationCha=新的变形通道3D(框);
var btnPlay:Sprite=新Sprite();
btnPlay.graphics.beginll(0x990000);
btnPlay.graphics.drawRect(0,0,60,20);
btnPlay.graphics.endFill();
addChild(btnPlay);
btnPlay.y=100;
btnPlay.addEventListener(MouseEvent.CLICK,playMD2);
var btnNextFrame:Sprite=新Sprite();
btnNextFrame.graphics.beginll(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);
}
专用函数框AnimationComplete(e:AnimationEvent):无效
{
跟踪(“框动画完成”);
}
专用函数playNextFrame(e:MouseeEvent):无效
{
如果(帧计数<_numFrames)帧计数++;
else frameCount=frameCount;
gotoFrame(帧计数);
}
私有函数boxLoaded(e:FileLoadEvent):无效
{
_channels=box.getAnimationChannels();
跟踪(“通道计数”、_通道长度);
倒带();
_numFrames=0;
_currentFrame=1;
对于每个(var通道:AbstractChannel3D in_通道)
{
_numFrames=Math.max(_numFrames,channel.keyFrames.length);
channel.updateToFrame(_currentFrame);
}
}
公共函数rewind():void
{
跟踪(“通道长度:+box.getAnimationChannels().length”);
对于每个(var通道:AbstractChannel3D in_通道)
{
信道更新帧(1);
}
}
公共函数gotofName(帧:编号):void
{
对于每个(var通道:AbstractChannel3D in_通道)
通道更新帧(帧);
}
私有函数playMD2(e:MouseEvent):无效
{
isPlaying=!isPlaying;
i播放?box.stop():box.play();
}
私有函数渲染(e:事件):无效
{
viewport.camera.orbit(mouseY*.5,mouseX*.5);
viewport.singleRender();
}
}
}
这是几个月前创建的,所以它可能值得chec使用