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] 

自分の検索で見たことから、これは文字列形式のチャンネル名の配列を返す必要があります。私はMorphChannel3Dオブジェクトからプロパティを抽出しようとしましたが、各オブジェクトに対しては成功しません(var p:* in Object)。

どこが間違っているのですか。アニメーションチャンネルの名前を取得して自由に呼び出せるようにするにはどうすればよいですか?

Example of the project here

感謝。

答えて

0

興味深いプロジェクトです。

私は少し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アニメーションを実装したかを見る機会はありませんでした。

これが役に立ちます。

関連する問題