본문 바로가기

카테고리 없음

Collada 모델을 마우스로 회전하는 예

마우스로 모델을 이리저리 회전해 보세요.



텍스쳐이미지로 사용된 이미지 cow.png

사용자 삽입 이미지

사용된 모델파일(Cow.dae)

아래의 코드는 모델에 포함된 텍스쳐를 사용하지 않고 새로운 텍스쳐를 적용하는 예이다.
모델에 포함되어 있는 원래의 텍스쳐를 사용하는 예제는 이 코드의 하단에 제시되어 있다.

package {
 
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.display.*;
  import org.papervision3d.lights.PointLight3D;
  import org.papervision3d.materials.BitmapMaterial;
  import org.papervision3d.materials.utils.MaterialsList;
  import org.papervision3d.objects.parsers.Collada;
  import org.papervision3d.view.BasicView;

  public class PV3D26ColladaObjects extends BasicView {
 
    [Embed(source="cow.dae", mimeType="application/octet-stream")] private var CowDAE:Class;
    [Embed(source="Cow.png")] private var CowBitmapImage:Class;

    private var light:PointLight3D;

    private var doRotation:Boolean = false;
    private var lastMouseX:int;
    private var lastMouseY:int;
    private var cameraPitch:Number = 60;
    private var cameraYaw:Number = -60;
      
    public function PV3D26ColladaObjects() {
      super(0, 0, true, true);

      init3D();

      createScene();

      stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
      stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

      startRendering();
    }
  
    private function init3D():void {
      camera.z = -500;
      camera.fov = 60;
      camera.orbit(cameraPitch, cameraYaw);
    }

  
    private function createScene():void {

   var cowMaterial:BitmapMaterial = new BitmapMaterial(Bitmap(new CowBitmapImage()).bitmapData);
      var cowMaterials:MaterialsList = new MaterialsList();
      cowMaterials.addMaterial(cowMaterial, "mat0");

      var cow:Collada = new Collada(new XML(new CowDAE()), cowMaterials);
   cow.y = -100;
  
      scene.addChild(cow);
    }

    override protected function onRenderTick(event:Event=null):void {
      updateCamera();
      super.onRenderTick(event);
    }
  
    private function updateCamera():void { 
      if (doRotation) {
        var dPitch:Number = (mouseY - lastMouseY) / 2;
        var dYaw:Number = (mouseX - lastMouseX) / 2;

        cameraPitch -= dPitch;
        cameraYaw -= dYaw;

        if (cameraPitch <= 0) {
          cameraPitch = 0.1;
        } else if (cameraPitch >= 180) {
          cameraPitch = 179.9;
        }

        lastMouseX = mouseX;
        lastMouseY = mouseY;

        camera.orbit(cameraPitch, cameraYaw);
      }
    }

    private function onMouseDown(event:MouseEvent):void {
      doRotation = true;
      lastMouseX = event.stageX;
      lastMouseY = event.stageY;
    }

    private function onMouseUp(event:MouseEvent):void {
      doRotation = false;
    }
  }
}



모델에 포함되어 있는 원래의 텍스쳐를 사용하려면 위의 코드 중에서 텍스쳐관련 내용들을 지우고 Collada객체를 생성할 때 텍스쳐 아규먼트를 null 로 대신하면 된다.
주의할 점은 현재 프로젝트에 텍스쳐로 사용될 이미지 파일은 포함되어 있어야 하며, 소스코드에 텍스쳐관련 코드가 들어가지 않아도 된다는 것이다.
****참고****
*.dae파일을 텍스트 에디터로 열어보면 텍스쳐이미지 파일명과 저장경로가 확인되므로 해당 파일들은 모두 현재 프로젝트내에서 적당한 폴더내에 복사되어 있어야 한다

package {
 
  import flash.display.*;
  import flash.events.Event;
  import flash.events.MouseEvent;
 
  import org.papervision3d.lights.PointLight3D;
  import org.papervision3d.materials.BitmapMaterial;
  import org.papervision3d.materials.utils.MaterialsList;
  import org.papervision3d.objects.parsers.Collada;
  import org.papervision3d.view.BasicView;

  public class PV3D26ColladaObjects extends BasicView {
 
    //[Embed(source="cow.dae", mimeType="application/octet-stream")] private var CowDAE:Class;
    //[Embed(source="Cow.png")] private var CowBitmapImage:Class;

    private var light:PointLight3D;

    private var doRotation:Boolean = false;
    private var lastMouseX:int;
    private var lastMouseY:int;
    private var cameraPitch:Number = 60;
    private var cameraYaw:Number = -60;
      
    public function PV3D26ColladaObjects() {
      super(0, 0, true, true);

      init3D();

      createScene();

      stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
      stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);

      startRendering();
    }
  
    private function init3D():void {
      camera.z = -400;
      camera.fov = 60;
      camera.orbit(cameraPitch, cameraYaw);
    }

  
    private function createScene():void {

   //var cowMaterial:BitmapMaterial = new BitmapMaterial(Bitmap(new CowBitmapImage()).bitmapData);
      //var cowMaterials:MaterialsList = new MaterialsList();
      //cowMaterials.addMaterial(cowMaterial, "mat0");

      //var cow:Collada = new Collada(new XML(new CowDAE()), cowMaterials);

      var cow:Collada = new Collada("cow.dae",null, 0.5);
   cow.y = -100;
  
      scene.addChild(cow);
    }

    override protected function onRenderTick(event:Event=null):void {
      updateCamera();
      super.onRenderTick(event);
    }
  
    private function updateCamera():void { 
      if (doRotation) {
        var dPitch:Number = (mouseY - lastMouseY) / 2;
        var dYaw:Number = (mouseX - lastMouseX) / 2;

        cameraPitch -= dPitch;
        cameraYaw -= dYaw;

        if (cameraPitch <= 0) {
          cameraPitch = 0.1;
        } else if (cameraPitch >= 180) {
          cameraPitch = 179.9;
        }

        lastMouseX = mouseX;
        lastMouseY = mouseY;

        camera.orbit(cameraPitch, cameraYaw);
      }
    }

    private function onMouseDown(event:MouseEvent):void {
      doRotation = true;
      lastMouseX = event.stageX;
      lastMouseY = event.stageY;
    }

    private function onMouseUp(event:MouseEvent):void {
      doRotation = false;
    }
  }
}