[PV3D] Basic

Flash - as2, as3 2009. 12. 27. 16:09
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.render.BasicRenderEngine;
	
	[SWF(backgroundColor="#000000", width="550", height="400")]
	public class Main extends Sprite 
	{
		/*
		 * 초기화 변수
		 */
		private var viewport:Viewport3D;
		private var scene:Scene3D;
		private var camera:Camera3D;
		private var material:ColorMaterial;
		private var primitive:Plane;
		private var renderer:BasicRenderEngine;
		
		public function Main():void 
		{
			// viewport = new Viewport3D( w, h, scaleToStage, interactive );
			viewport = new Viewport3D( 550, 400, false, true );
			addChild( viewport );
			
			// 오브젝트가 그려지는 컨테이너 scene
			scene = new Scene3D();
			camera = new Camera3D();
			
			// 스테이지에 scene 을 그리는 renderer
			renderer = new BasicRenderEngine();
			
			// 양면을 가진 재질 생성
			material = new ColorMaterial( 0x0000ff );
			material.doubleSided = true;
			
			// Plane : 재질을 토대로 생성되는 Object(뼈대)
			// segment 개수는 면을 이루는 조각의 수
			// 많을수록 디테일해지지만 CPU 점유높아짐
			// primitive = new Plane( material, w, h, wSegments, hSegments );
			primitive = new Plane( material, 200, 200, 6, 6);
			scene.addChild( primitive );
			
			addEventListener( Event.ENTER_FRAME, onEnterFrame );
		}
		
		private function onEnterFrame( e:Event ):void
		{
			/*
			 * renderScene 속성은 scene, camera, viewport 의 데이터를 받아
			 * viewport 를 업데이트.
			 */
			primitive.rotationY += 2;
			renderer.renderScene( scene, camera, viewport );
		}


{ Papervision3D API }
http://papervision3d.googlecode.com/svn/trunk/as3/trunk/docs/index.html


출처 : http://cdsig.tistory.com/191

1. ViewPort3D
*상속관계 ViewPort3D -> Sprite
(ViewPort는 Sprite 상속받았으므로 눈에 보이는 것임을 알 수 있다.)
ViewPort는 PV3D에 의해서 만들어지는 화면(이미지/영상)을 플래시에 연결시키는 ... 클래스이다.    
PV3D는 flash와는 전혀 다른 독자적인 화면랜더링 방식을 취하기 때문에 PV3D와 flash를 연결해주는 것이 필요하다.
그 역할을 ViewPort가 하는 것이다. { PV3D <--> flash }


2. Scene3D
*상속관계 Scene3D -> SceneObject3D -> DisplayObjectContainer3D -> EventDispatcher -> Object
(기본 상속관계 뼈대를 벗어나 자기만의 상속관계를 가진다는 것을 알 수 있다.)

Scene3D는 PV3D에서 stage와 같은 역할을 하는 객체이다.
그러므로 container 역할이 필요함( DisplayObjectContainer3D 상속 )

여기서 DisplayObjectContainer3D 는 DisplayObject3D를 담을 수 있는 능력이 있어서
addChild( displayObject3D ) / removeChild /  numChildren 와 같은 기능이 가능하다.
( AS3  DisplayObject 기본 계층구조의 DisplayObjectContainer 참조)


3. Camera3D
*상속관계 Camera3D -> CameraObject3D -> DisplayObject3D -> DisplayObjectContainer3D -> EventDispatcher -> Object
( DisplayObjectContainer3D을 상속받았다는 것이 매우 중요하다.)

DisplayObject3D ::: 플래시의 Sprite 같은 객체로서
x, y, z, scaleX, scaleY, scaleZ, rotationX, rotationY, rotationZ, alpha, ... addChild/ removeChild 가 가능하다.
기존 flash는 고정 카메라였으나 PV3D에서는 다양한 각도와 움직임이 있기 때문에 상당히 복잡한 메카니즘을 가지게 된다.


4.BasicRenderEngine
*상속관계 BasicRenderEngine -> AbstractRenderEngine ->  EventDispatcher -> Object
플래쉬는 플래시 플레이어가 알아서 랜더링 해주지만 플래시 플레이어는 DisplayObject를 상속받은 객체만 랜더링 해준다...
PV3D는 DisplayObject를 상속받은게 아니라서.... 별로도 랜더링 해 줄수있는... flashPlayer 같은 객체가 필요하다...!!  
그 역할을 RenderEngine이 하는 것이다.


*** Plane (for 3D Object)
*상속관계 Plane -> TriangleMesh3D -> Vertices3D -> DisplayObject3D -> DisplayObjectContainer3D -> EventDispatcher -> Object
TriangleMesh3D :: 삼각형 면  <--- 안에 내용( material )을 채울 수 있다..
눈에 보이기 위한 최소면 단위는 삼각형이다. (3개 vertexs(점들)이 이루는 최소면 )  그래서 눈에 보이는 도형들은 모두 TriangleMesh3D 로 만든다. (점 두개가 모이면 선...선은 눈에 보이지 않는다...점 세개가 모이면 면이 된다. 그러므로 최소한의 면은 점 세개가 모여서 만들어진 트라이앵글이다.) 복잡한 도형의 경우 여러개의 triangle을 연결하여 만드는 것이다.
: