마우스로 모델을 이리저리 회전해 보세요.
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;
}
}
}