Papervision3D 2.0 DAE 06
사용된 모델과 텍스쳐 파일
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);
}
}
}