Papervision3D 의 기본 뼈대가 되는 코드는 다음과 같습니다.

기본적으로 Sprite 클래스를 상속받고, Viewport3D, Scene3D, Camera3D, BasicRenderEngine 들을 생성/초기화 한 후,
Event.ENTER_FRAME 의 이벤트헨들러에서 계속적으로 renderScene 을 호출하여 3D 화면을 렌더링 합니다.
아래는 검은 배경에 와이어프레임형태의 구(Sphere)를 하나 그리는 내용입니다.

package
{
    import flash.display.Sprite;
    import flash.events.Event;
 
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
 
    [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
    public class HelloPV3D extends Sprite
    {
        private var viewport:Viewport3D;
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var renderer:BasicRenderEngine;
 
        public function HelloPV3D()
        {
            viewport = new Viewport3D();
            addChild(viewport);
 
            scene = new Scene3D();
            camera = new Camera3D();
            renderer = new BasicRenderEngine();
 
            var sphere:Sphere = new Sphere();
            scene.addChild(sphere);
 
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
 
        private function enterFrameHandler(event:Event):void
        {
            renderer.renderScene(scene, camera, viewport);
        }
 
    }
}

Viewport3D, Scene3D, Camera3D, BasicRenderEngine 이들이 핵심이라고 할 수 있는데, 이들의 정체를 Reference 에서 살펴보면 다음과 같습니다.

Viewport3D Inheritance flash.display.Sprite
Scene3D Inheritance SceneObject3D Inheritance DisplayObjectContainer3D Inheritance flash.events.EventDispatcher
Camera3D Inheritance CameraObject3D Inheritance DisplayObject3D Inheritance DisplayObjectContainer3D Inheritance flash.events.EventDispatcher
BasicRenderEngine Inheritance AbstractRenderEngine Inheritance flash.events.EventDispatcher

BasicRenderEngine links Viewport3Ds, Scene3D, and Camera3Ds together by gathering in all of their data, rendering the data, then calling the necessary functions to update from the rendered data

한편, 위와 같은 일련의 기본적인 초기화 코드를 구현해 놓은 클래스가 있는데, 바로 BasicView 입니다.
BasicView 를 사용하면 Viewport3D, Scene3D, Camera3D, BasicRenderEngine 초기화 과정을 거치지 않아도 됩니다.

package
{
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.view.BasicView;
 
    [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
    public class BasicViewTest extends BasicView
    {
        public function BasicViewTest()
        {
            var sphere:Sphere = new Sphere();
            scene.addChild(sphere);
            startRendering();
        }
 
    }
}

이때 render.renderScene(scene, camera, viewport) 부분이 startRendering() 으로 바뀐 것을 볼 수 있습니다.
만약 매 프레임 렌더시에 무언가를 하려면 다음과 같이 BasicView 의 render 함수를 오버라이드해서 우리가 구현할 수 있습니다.

package
{
    import flash.events.Event;

    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.view.BasicView;
 
    [SWF(width="640", height="480", backgroundColor="#000000", frameRate="60")]
    public class BasicViewTest extends BasicView
    {
        public function BasicViewTest()
        {
            var sphere:Sphere = new Sphere();
            scene.addChild(sphere);
            startRendering();
        }

        override protected function onRenderTick(event:Event=null):void
        {
            // 여기서 추가적인 무엇인가를 수행
            renderer.renderScene(scene, camera, viewport);
        }

    }
}

onRenderTick 은 BasicView 클래스에 구현되어 있습니다만, 우리가 여기서 override 하여 우리만의 추가적인
기능을 부여할 수 있습니다.


이번엔 면(Plane)을 하나 만들어 빙글빙글 돌려 보겠습니다.



package
{
    import flash.display.Sprite;
    import flash.events.Event;
 
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    
    import org.papervision3d.materials.ColorMaterial; // 면에 입힐 재질 라이브러리
    import org.papervision3d.objects.primitives.Plane; // 면을 위한 라이브러리 

    [SWF(width="640", height="480", backgroundColor="#ffffff", frameRate="60")]
    public class HelloPV3D extends Sprite
    {
        private var viewport:Viewport3D;
        private var scene:Scene3D;
        private var camera:Camera3D;
        private var renderer:BasicRenderEngine;
        public var plane:Plane; // Plane(면) 클래스의 인스턴스변수 선언

        public function HelloPV3D()
        {
            viewport = new Viewport3D();
            addChild(viewport);
 
            scene = new Scene3D();
            camera = new Camera3D();
            renderer = new BasicRenderEngine();
 
            var material:ColorMaterial = new ColorMaterial(0x33ddff, 1); // 파란색 재질 생성
            material.doubleSided = true;

            plane = new Plane(material, 300, 300, 1, 1); // 위에서 만든 재질로 면을 생성
            scene.addChild(plane); // 씬에 면을 추가
 
            addEventListener(Event.ENTER_FRAME, enterFrameHandler);
        }
 
        private function enterFrameHandler(event:Event):void
        {
            plane.yaw(2); // 면을 2도씩 Y축을 기준으로돌린다
            renderer.renderScene(scene, camera, viewport);
        }
 
    }
}

위에서 x, y, z 축의 회전은 각각 pitch, yaw, roll 을 사용합니다. 즉,
plane.pitch(2);
plane.yaw(2);
plane.roll(2);
이렇게 다 써주면 x,y,z 축 모두를 기준으로 빙글빙글 돌겠죠.
Posted by 알 수 없는 사용자