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);
}
}
}