본문 바로가기

카테고리 없음

Papervision3D 2.0 DAE 04

사용자 삽입 이미지
사용자 삽입 이미지

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.*;
 /* Google에서 다운로드한 cow.dae, skydome.dae와 그 텍스쳐 이미지들을 이용하여
 * 하늘을 배경으로 하여 젖소가 서 있는 화면을 구성해 본다.
 * 카메라를 제자리에서 Y축을 중심으로 회전하고 있으므로 360도 하늘의 전경을 볼 수 있다.
 * 모델파일과 텍스쳐 이미지는 SWF파일에 포함되도록 하였다.
 */
 public class DAE04 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;
  [Embed(source="images/skyTexture.png")]  private var SkyTexture:Class;
  [Embed(source="skydome.dae",mimeType="application/octet-stream")] private var SkyDAE:Class;
 
  public function DAE04(viewportWidth:Number=640, viewportHeight:Number=480, scaleToStage:Boolean=true, interactive:Boolean=false, cameraType:String="Camera3D")
  {
   super(0, 0, true, true, cameraType);
   camera.z=0;
   /* 포함된 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);
   cowModel.scale = 0.2;
   cowModel.z = 200; // 카메라가 원점에 위치할 예정이므로 소 모델을 카메라의 앞쪽으로 이동하게 한다
   
   // 모델파일이 로드되어야만 이벤트를 등록할 수 있으므로 그 때까지 기다린다.
     cowModel.addEventListener(FileLoadEvent.LOAD_COMPLETE, onLoadComplete);
     
     /* 하늘모델은 이벤트에 반응할 필요가 없기 때문에 이벤트를 설정하지 않았다. */
   var sky:DAE = new DAE();
   var skyba:ByteArray = new SkyDAE() as ByteArray;
   var skyxml:XML = new XML(skyba.readUTFBytes(skyba.length));
   
   var mat2:BitmapMaterial = new BitmapMaterial(Bitmap(new SkyTexture()).bitmapData);
   var matList2:MaterialsList = new MaterialsList();
   matList2.addMaterial(mat2,"material_0_1_8");
   sky.load(skyxml, matList2);
   
   scene.addChild(cowModel); // 소 모델
   scene.addChild(sky);   // 하늘 모델
   
   this.startRendering();
  }
 
  override protected function onRenderTick(event:Event=null):void {
   camera.yaw(1);
   super.onRenderTick(event);
  }
 
  private function onObjectPress(event:InteractiveScene3DEvent):void {
   trace("마우스 눌림");
  }
  private function onObjectOver(event:InteractiveScene3DEvent):void {
   trace("마우스 오버");
  }
  private function onMoveOnObject(event:InteractiveScene3DEvent):void {
   trace("마우스 이동");
  }
  // 오브젝트와 텍스쳐가 모두 로드되기를 기다렸다가 이벤트리스너를 등록해 준다.
  private function onLoadComplete(event:Event):void {
   /* DAE파일을 에디터로 열고 다음과 같은 부분에서 Material의 이름을 확인할 수 있다.
    <instance_material symbol="mat0" target="#material0">
   */
   var mat:MaterialObject3D = cowModel.getMaterialByName("mat0");
   mat.interactive = true; // 오브젝트가 이벤트에 반응할 수 있도록 설정해 준다
   /* 아래의 'vsn-mats' 라는 이름은 cowModel.childrenList()를 통해 얻을  수도 있고
   * DAE 파일을 에디터로 열고 다음과 같은 부분을 찾아보면 확인할 수도 있다.
   * <library_visual_scenes>
    <visual_scene id="VisualSceneNode" name="SceneNode">
     <node id="vsn-mats" name="vsn-mats">
   */
   var obj:DisplayObject3D = cowModel.getChildByName("vsn-mats");
   
   obj.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, onObjectPress);
   obj.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onObjectOver);
   obj.addEventListener(InteractiveScene3DEvent.OBJECT_MOVE, onMoveOnObject);
  }
 }
}