[PV3D] Basic
Flash - as2, as3 2009. 12. 27. 16:09package
{
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을 연결하여 만드는 것이다.