카테고리 없음

Papervision3D 2.0 DAE 06

Soul-Learner 2009. 3. 31. 21:52
아래의 3D 모델을 마우스로 이리저리 회전해 보세요

사용된 모델과 텍스쳐 파일


package
{
 import flash.display.*;
 import flash.events.*;
 import flash.utils.*;
 
 import org.papervision3d.core.proto.*;
 import org.papervision3d.events.*;
 import org.papervision3d.materials.*;
 import org.papervision3d.materials.utils.*;
 import org.papervision3d.objects.*;
 import org.papervision3d.objects.parsers.*;
 import org.papervision3d.view.*;
 /* Collada 클래스를 이용하여 DAE파일을 로드하고 오브젝트가 마우스이벤트에
 * 반응하도록 이벤트리스너를 설정해 주는 예
 * 이벤트에 반응하도록 하려면 Viewport3D의 생성자나 BasicView의 생성자를 이용하여
 * interactive속성을 true로 설정해 주고 또한, Material의 interactive속성도 true로
 * 설정해 주어야 하며 끝으로 오브젝트에 이벤트리스너를 연결해 주면 된다
 * 모델파일이 SWF에 포함되어 있기 때문에 FileLoadEvent.LOAD_COMPLETE이벤트는 발생하지 않는다.
 * 그러므로 이벤트안에서 이루어지던 작업은 실행되지 않으므로 별도의 함수를 선언하여 실행해 주어야 한다.
 */
 public class DAE06 extends BasicView
 {
  private var cowModel:Collada;
 
  [Embed(source="images/Cow.png")]
  private var CowTexture:Class;

  [Embed(source="cow.dae", mimeType="application/octet-stream")]
  private var CowDAE:Class;
 
  public function DAE06(viewportWidth:Number=640, viewportHeight:Number=480, scaleToStage:Boolean=true, interactive:Boolean=false, cameraType:String="Camera3D")
  {
   super(0, 0, true, true, cameraType);

   /* 포함된 Embed 클래스를 이용하여 Material을 생성한다 */
   var mat:BitmapMaterial = new BitmapMaterial(Bitmap(new CowTexture()).bitmapData);
   var matList:MaterialsList = new MaterialsList();
   matList.addMaterial(mat,"mat0");
   
   /* 포함된 Embed 클래스를 이용하여 DAE 모델을 생성한다 */
   var ba:ByteArray = new CowDAE() as ByteArray;
   var xml:XML = new XML(ba.readUTFBytes(ba.length));

   cowModel = new Collada(xml,matList);
   /* SWF파일에 모델을 포함했기 때문에 FileLoadEvent.LOAD_COMPLETE이벤트는 발생하지 않는다.
   * 그러므로 아래의 코드는  호출해서는 안된다
   * cowModel.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoadComplete);
   */
   cowModel.scale = 2;
   // FileLoadEvent.LOAD_COMPLETE이벤트를 이용하는 대신에 이벤트를 설정하는 메소드를 호출해 준다
     addEvtListener();

   scene.addChild(cowModel);
   
   this.startRendering();
  }
 
  override protected function onRenderTick(event:Event=null):void {
   camera.orbit(pitch, yaw, true);
   super.onRenderTick(event);
  }
 
  private var pressed:Boolean = false;
  private var lastX:Number = 0;
  private var lastY:Number = 0;
  private function onObjectPress(event:InteractiveScene3DEvent):void {
   trace("마우스 눌림");
   lastX = this.mouseX;
   lastY = this.mouseY;
   pressed = true;
  }
 
  private var pitch:Number = 90;
  private var yaw:Number = 270;
  private function onMouseMove(event:Event):void {
   if(!pressed) return;
   var diffX:Number = lastX-mouseX;
   var diffY:Number = lastY-mouseY;
   yaw += diffX;
   pitch += diffY;
   if(pitch>=180) pitch=179.9;
   else if(pitch<=0) pitch=0.1;
   lastX = mouseX;
   lastY = mouseY;
  }
 
  private function onMouseUp(event:Event):void {
   pressed = false;
  }
 
  // 오브젝트와 텍스쳐가 모두 로드되기를 기다렸다가 이벤트리스너를 등록해 준다.
  // SWF파일에 모델이 포함된 경우에는 이 함수가 호출되지 않으므로 불필요하다.
  /*
  private function onLoadComplete(event:Event):void {
   var mat:MaterialObject3D = cowModel.getMaterialByName("mat0");
   mat.interactive = true;
   // 아래의 'vsn-mats' 라는 이름은 cowModel.childrenList()를 통해 얻을 수 있다
   var obj:DisplayObject3D = cowModel.getChildByName("vsn-mats");
   
   obj.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onObjectPress);
   stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
   stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  }*/
  //
  private function addEvtListener():void {
   var mat:MaterialObject3D = cowModel.getMaterialByName("mat0");
   mat.interactive = true;
   // 아래의 'vsn-mats' 라는 이름은 cowModel.childrenList()를 통해 얻을 수 있다
   var obj:DisplayObject3D = cowModel.getChildByName("vsn-mats");
   
   obj.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onObjectPress);
   stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
   stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
  }
 }
}