2009-03-30 2 views
0

현재 FlarToolkit/Papervision3D/Quake2 모델 구문 분석을하고 있는데, 성공적으로로드하고, 텍스처 처리하고 애니메이션 처리했습니다. 즉, 애니메이션 호출은 단지 추측에 불과하고 지금까지 내가 아는 것은 "점프"와 "실행"이 가능하다는 것입니다. MD2 클래스의 내장 getAnimationChannels()를 사용하면 다음과 같이 MorphChannel3D 객체를 반환하고 배열합니다.Actionscript 3에서 Papervision 3D로 md2의 애니메이션 채널을 반환 하시겠습니까?

// 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] 

,이 문자열 형태로 채널 이름의 배열을 반환해야합니다. 나는 각 (var p : * Object)를 사용하여 성공하지 않고 MorphChannel3D Object에서 속성을 추출하려고 시도했다.

어디에서 잘못 될까요? 애니메이션 채널의 이름을 어떻게 불러 와서 불러도 되나요?

Example of the project here

감사합니다.

답변

0

흥미로운 프로젝트입니다.

MD2와 조금 놀았지만 혼란 스러웠습니다. 어떤 수업을 사용해야할지 몰랐습니다. 나는 서류상의 메일 링리스트에 사람들에게 질문했지만 명확한 대답은하지 않았다.

다음은 업데이트를 확인하는 동안 그것을 가치가있을 수도 있으므로 이것은, 몇 달 전에 생성 된 내 테스트

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 애니메이션을 구현했는지 볼 기회가 없었습니다.

희망이 도움이됩니다.

관련 문제