STEP1 :  DisplayObject3D의 선회 축 만들기

: 이전 Netsting 에서 Sphere에 Sphere를 addChild하여 부모 자식 관계를 만든 다음 부모를 회전시켜 처리 하였다면, 이번에는 Sphere대신 DisplayObject3D에 Sphere를 추가시켜 do3D를 회전시켜 본다.
=> 즉, do3D가 선회 축이 되는 것임.

[ 참조 ]
(이제부터 DisplayObject3D는 길기 땜시 줄여 do3D라고 부르기로 함.)

STEP2 : 꼭지점에 접근하는 방법

ex) _sphere.geometry.vertices[i].x 
이런 식으로 해당 do3D Object에서 geometry (기하) => vertices (꼭지점) => [i] (인덱스) => x (좌표) 순서로 접근한다.

STEP3 : 삼각 면에 접근하는 방법

ex) _sphere.geometry.faces[i]
이런 식으로 해당 do3D Object에서 geometry (기하) => faces (면) => [i] (인덱스) 로 접근한다.
접근한 면은 [object Triangle3D]로 변환하여 사용할 수 있다.

구 안쪽에 구 넣기

이제 위에서 배운 3가지 단계를 거쳐 구 내부에 작은 구를 넣는 방법을 적용하여 보겠습니다 ^^;
(주석 참조 => 모르는거 있음 리플 주시고요 ㅋ)


//Main.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       frameRate="40"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    import sample.VerticesExample;

                    import mx.core.UIComponent;

                   

                    private function init():void{

                           var bs:VerticesExample = new VerticesExample();

                          

                           var ui:UIComponent = new UIComponent();

                           ui.addChild(bs);

                          

                           this.addChild(ui);

                    }

                   

             ]]>

       </mx:Script>

</mx:Application>


//VerticesExample.as

package sample

{

       import flash.events.Event;

      

       import org.papervision3d.objects.DisplayObject3D;

       import org.papervision3d.objects.primitives.Sphere;

       import org.papervision3d.view.BasicView;

 

       public class VerticesExample extends BasicView

       {

             private var _do3D:DisplayObject3D;

            

             public function VerticesExample()

             {

                    init();

                    startRendering();

             }

            

             private function init():void{

                   

                    _do3D = new DisplayObject3D();   //회전 생성

                    scene.addChild(_do3D);

                   

                    //작은 원들이 들어갈 원을 생성, 실제  scence 에는 추가되지 않음.

                    var bigSphere:Sphere = new Sphere(null,200,10,10);  

                    // 원의 꼭지점 계산

                    var vLen:uint = bigSphere.geometry.vertices.length; 

                   

                    for(var i:uint=0;i<vLen;i++){

                          

                           //작은 생성

                           var smallSphere:Sphere = new Sphere(null,Math.random()*30,2,2);  

                          

                           // 원의 꼭지점 좌표에 작은 원을 위치 한다.

                           smallSphere.x = bigSphere.geometry.vertices[i].x;   

                           smallSphere.y = bigSphere.geometry.vertices[i].y;

                           smallSphere.z = bigSphere.geometry.vertices[i].z;

                          

                           //작은원을 삽입한다. 큰원은 삽입 안됨( 원은 꼭지점 참조용)

                           _do3D.addChild(smallSphere);

                    }

                   

             }

            

             override protected function onRenderTick(event:Event=null):void{

                   

                    _do3D.localRotationY+=1;   //회전축 돌리기

                   

                    super.onRenderTick();

             }

            

       }

}

Nesting(둥지) 부모Object 하나 혹은 다수의 Object 추가하는 기술입니다. 이점으로는 계층적 구조를 유지하여 부모에 상대적인 변화를 보여준다. 예를 들면 부모의 좌표계를 변경하면 자식의 좌표 또한  상대적으로 변화 합니다.


[ 참조 ]

Scene3D (scene) DisplayObject3D (sphere) DisplayObjectContainer3D 상속받아, DisplayObjectContainer3D addChild() 메소드를 사용할 있게 됩니다.
 

 DisplayObjectContainer3D

DisplayObject3D

DisplayObjectContainer3D

SceneObject3D

  Scene3D


 

[예제 3개의 Sphere() 상대적으로 돌아가는 화면 태양-지구-? ]

: 지구는 태양을 중심으로 돌고 달은 지구를 중심으로 돌고 있는 형태입니다.

(자세한 값을 확인하고 싶은 경우 sceneX, sceneY, sceneZ 값을 확인하면 좋습니다.)

=> 결론 상대적으로 움직이는 이득을 있습니다. 여러 곳에 쓰일 있겠죠.. ^^



//Main.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       frameRate="40"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    import sample.NestingExample;

                    import mx.core.UIComponent;

                   

                    private function init():void{

                           var bs:NestingExample = new NestingExample();

                          

                           var ui:UIComponent = new UIComponent();

                           ui.addChild(bs);

                          

                           this.addChild(ui);

                    }

                   

             ]]>

       </mx:Script>

</mx:Application>


//NestingExample.as

package sample

{

       import flash.events.Event;

      

       import org.papervision3d.objects.primitives.Sphere;

       import org.papervision3d.view.BasicView;

 

       public class NestingExample extends BasicView

       {

             private var _sunSphere:Sphere;

             private var _earthSphere:Sphere;

             private var _moonSphere:Sphere;

            

             public function NestingExample()

             {

                    init();

                    startRendering();

             }

            

             private function init():void{

                                       

                    _sunSphere = new Sphere(null,200,16,12);

                    _earthSphere = new Sphere(null,100,12,8);

                    _moonSphere = new Sphere(null,50,8,4);

                    _earthSphere.x = 400;

                    _earthSphere.y = -50;

                    _moonSphere.x = 200;

                    _moonSphere.y = 50;

                                                           

                    scene.addChild(_sunSphere);

                    _sunSphere.addChild(_earthSphere);

                    _earthSphere.addChild(_moonSphere);

                   

             }

            

             override protected function onRenderTick(event:Event=null):void{

                    _sunSphere.localRotationY+=1;

                    _earthSphere.localRotationY+=2;

                                       

                    super.onRenderTick();

             }

       }

}

 

Plane 생성자


Plane(material:MaterialObject3D=null, width:Number=0, height:Number=0, segmentsW:Number=0, segmentsH:Number=0)

 

파라미터

데이터 타입

기본

상세설명

material

MaterialObject3D

null

Plane 적용하고 싶은 Material 정의한다.

width

Number

0

넓이를 설정한다.

height

Number

0

높이를 설정한다.

segmentsW

Number

0

좌우 조각

segmentsH

Number

0

상하 조각

 

[그림 : segments(조각) 변화에 따른 Plane (1,1) / (2,1) / (2,2)]

참조 => (0,0)으로 설정하면 (1,1) 동일함.

 

[알고 가기 : 1]

Plane 이미지를 투영 시킬 흔히 이미지가 찌그러지는 현상을 목격할 있는데 이럴 경우에는 segments(조각) 숫자를 증가시키면 좀더 부드러운 화면을 있다. 하지만 조각의 수가 증가하면 할수록 렌더링 속도가 느려짐에 유의해야 한다. 참고로 개의 Scene에서 3000 이하의 Triangle 존재하도록 하는 것이 좋다.

 

[알고 가기 : 2]

Plane 회전(Rotate)시키는 경우, 기본적으로 면의 wireframe(철골구조물 - 외각 뼈대) Material 적용되어 있어 다른 면에는 null 적용된다. 이런 경우에는 양면모드 설정을 적용시켜줘야 한다.

ex) plane.material.doubleSided = true;

 

[알고 가기 : 기타]

Z축은 depth 조절하는 것이다 이는 카메라를 찍을 Zoom in, out 조절하는 것과 유사하다, 실제로 적용해서 보면 사물의 크기가 커졌다 작아졌다 하는 것을 있다.


예제 - Plane을 z좌표를 조절하면서 y축 기준으로 회전시키기



: 본 예제를 습득한 이후 각자 Sphere, Cylinder, Cone, Cube, Arrow, PaperPlane 의 생성자를 확인한 이후 본 예제를 응용하면 손쉽게 테스트가 가능할 것입니다 ^^.

//Main.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       frameRate="40"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    import sample.PlaneExample;

                    import mx.core.UIComponent;

                   

                    private function init():void{

                           var bs:PlaneExample = new PlaneExample();

                          

                           var ui:UIComponent = new UIComponent();

                           ui.addChild(bs);

                          

                           this.addChild(ui);

                    }

                   

             ]]>

       </mx:Script>

</mx:Application>


//PlaneExample.as

package sample

{

       import flash.events.Event;

      

       import org.papervision3d.objects.primitives.Plane;

       import org.papervision3d.view.BasicView;

 

       public class PlaneExample extends BasicView

       {

             private var _plane:Plane;

             private var _dir:int=1;

            

             public function PlaneExample()

             {

                    init();

                    startRendering();

             }

            

             private function init():void{

                   

                    var p:Plane = new Plane(null,300,300,1,1);    //고정용

                   

                    _plane = new Plane(null,300,300,1,1);   //움직이는

                    _plane.material.doubleSided = true;

                   

                    scene.addChild(_plane);

                    scene.addChild(p);

             }

            

             override protected function onRenderTick(event:Event=null):void{

                   

                    _plane.localRotationY+=1;

                   

                    if(_plane.z>100) _dir=-1;

                    else if(_plane.z<-100) _dir=1;

                   

                    _plane.z+=(_dir*10);

                   

                    super.onRenderTick();

             }

            

       }

}

'etc > old' 카테고리의 다른 글

[ PV3D ] 3-4 구 안쪽에 구 넣기  (0) 2009.10.12
[ PV3D ] 3-3 Nesting (둥지)  (0) 2009.10.10
[ PV3D ] 3-1 Primitives 기본모델?  (0) 2009.10.10
[ PV3D ] 2-3 기초예제 2 - 코드량 줄이기  (0) 2009.10.08
[ PV3D ] 2-2 기초 예제 1  (0) 2009.10.08
The basic elements of 3D objects (3D Object 기본 요소)

 

Vertices (꼭지점) : 3D도형의 Object 꼭지점의 조합으로 이뤄져 있으며, 2D 가진 x, y축에 z축을 추가하여 3D x, y, z 상의 점으로 이뤄져 있다.

 

Triangles (삼각형) : 3개의 꼭지점으로 이뤄진 면을 말한다. 다른 3D프로그램은 4개의 꼭지점으로 이뤄진 quad face (4) 제공하지만 PV3D에서는 Triangles만을 지원한다. 아래 그림과 같이 PV3D에서는 Triangles 조합을 통해 3D Object 구성할 있다.


 

[ 그림 : 꼭지점 4 -> 삼각형 2 -> 삼각 ]

 

여러 Triangle mesh (삼각 ) 가지고 넓이 높이와 깊이 설정을 통해 아래와 같이 3D Object 표현 있다.



PV3D에서는 7가지의 Primitives (기본모델?) 제공합니다.


 


Plane (
평면), Sphere (), Cylinder(원통), Cone(원뿔), Cube(정육면체), Arrow(화살), Paper Plane(종이비행기)

 

여기서 참조로 종이비행기와 화살표는 특별한 케이스로 3D프로그램에서 자주 나오는 Utah teapot (주전자) 유사하게 테스트 등에서 자주 사용됩니다.

The rendering pipeline ( 렌더링 경로 )


PV3D에서는 3D Object 표현하기 위해 여러 경로를 거치며 과정을 Rendering Pipeline 이라 한다.

 

Initialization (초기화) => Projection (투영) => Rendering (표현) 거치게 된다.

 

Initialization (초기화) : 초기에 1번만 발생하는 것으로 Viewport, Scene, Camera, Renderer 등을 생성하며 초기화 설정을 한다.

 

Projection (투영) : 3D 좌표를 2D 화면에 전환하여 표현하는 것으로, Object 3D 꼭지점을 연산하여 2D

화면에 보여질 것을 투영하는 것이다.

 

Rendering (표현) : 스크린에 보여질 이미지를 그리는 과정으로, 2D Projection 데이터를 조합하여 표현한다. 렌더링 과정은 lineTo() : 삼각형 그리기 => beginBitmapFill() : 텍스쳐() 추가를 거치게 된다.


BasicView를 상속받아  처리하여 이전 기초예제 1과 비교해서 코드량이 획기적으로 줄어 든 것을 확인 할 수 있다.

BasicView는 기본적으로 처리해야 될 업무를 처리해 줘서 (Scene, Viewport, Camera, 랜더러 설정..) 우리는 그것에 필요한 최소 정보 입력을 통해 손쉽게 코드를 구성할 수 있다. 책에서는 이렇게 말했고... 역시 코드는 짧고 명확하며 알아보기 쉬우면 그것으로 된것이다, 물론 내부처리까지 다 알아서 좀더 퍼포먼스가 낳은것을 개발하는 것도 좋지만 짧은 개발시간에 비춰 본다면 우선적으로 전체를 보고 구상하는 것이 먼저라고 하는것이 좋을거 같다, 이후에 뭐 시간 남으면 좀더 안쪽으로 Detail하게 ...

아래 코드는 원형 구체를 X축 방향으로 돌리는 예제 입니다. 간결하면서도 확실하게 눈에 쏙 들어오는 코드 ^_^



//Main.mxml

<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       frameRate="40"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    import sample.BasicViewExample;

                    import mx.core.UIComponent;

                   

                    private function init():void{

                           var bs:BasicViewExample = new BasicViewExample();

                          

                           var ui:UIComponent = new UIComponent();

                           ui.addChild(bs);

                          

                           this.addChild(ui);

                    }

                   

             ]]>

       </mx:Script>

</mx:Application>


//BasicViewExample.as

package sample

{

       import flash.events.Event;

       import org.papervision3d.objects.primitives.Sphere;

       import org.papervision3d.view.BasicView;

 

       public class BasicViewExample extends BasicView

       {

             private var _sphere:Sphere;

            

             public function BasicViewExample()

             {

                    _sphere = new Sphere();

                    scene.addChild(_sphere);

                   

                    startRendering();               

             }

            

             override protected function onRenderTick(event:Event=null):void{

                   

                    _sphere.localRotationX += 1;

                   

                    super.onRenderTick();

             }

            

       }

}


'etc > old' 카테고리의 다른 글

[ PV3D ] 3-2 Primitives - Plane  (0) 2009.10.10
[ PV3D ] 3-1 Primitives 기본모델?  (0) 2009.10.10
[ PV3D ] 2-2 기초 예제 1  (0) 2009.10.08
[ PV3D ] 2-1 PV3D기본 SCENE, CAMERA, VIEWPORT ...  (0) 2009.10.08
[ PV3D ] 1-1 환경설정  (0) 2009.10.08
아래 예제를 실행하면 처음으로 3D Object를 확인 할 수 있다 ^_^ 감격의 기쁨 ~

 [ 그림 : 결과물 ]

- Scene, Camera, Viewport를 생성한다음 Object를 삽입한 이후 Rendering 한다가 기본임을 알고 넘어가면 쉽다.


 

this.addChild(_viewport);

_scene.addChild(_sphere);
_renderer.renderScene(_scene,_camera,_viewport);


1. 우리가 실제 볼 viewPort를 sprite에 넣어준다.
2. Scene에 Object를 삽입한다.
3. 우리가 지정한 Scene, Camera, Viewport 를 기준으로 렌더링을 한다.
=> 결과물은 viewport를 통해 볼 수 있게 된다.


 

//Main.mxml
<?xml version="1.0" encoding="utf-8"?>

<mx:Application

       creationComplete="init()"

       xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

       <mx:Script>

             <![CDATA[

                    import mx.core.UIComponent;

                    import sample.BasicSample;

                   

                    private function init():void{

                           var bs:BasicSample = new BasicSample();

                           var ui:UIComponent = new UIComponent();

                           ui.addChild(bs);

                           this.addChild(ui);

                    }

             ]]>

       </mx:Script>

</mx:Application>

//BasicSample.as

package sample

{

       import flash.display.Sprite;

      

       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;

 

       public class BasicSample extends Sprite

       {

             private var _scene:Scene3D;

             private var _viewport:Viewport3D;

             private var _camera:Camera3D;

             private var _renderer:BasicRenderEngine;

             private var _sphere:Sphere;

            

             public function BasicSample()

             {

                    //Scene, Camera, Viewport 생성 => Object 삽입 => 랜더링 

                    _scene = new Scene3D();

                    _camera = new Camera3D();

                    _viewport = new Viewport3D();

                    _sphere = new Sphere();

                    _renderer = new BasicRenderEngine();

                   

                    this.addChild(_viewport);

                    _scene.addChild(_sphere);              

                    _renderer.renderScene(_scene,_camera,_viewport);

             }

            

       }

}



 

Scene : 3D 표현하기 위한 공간으로 x, y ,z 축으로 이뤄져 있다. 각각의 오브젝트를 보여주기 위해서는 반드시 신에 포함 되어야 .

 

Camera : Scene 내부에 존재하는 3D공간을 기록하는 것으로 , 카메라는 현재 Scene 보고 있는 시점을 정의한다. 3D 공간에서 시점을 바라보는 것으로 사진 찍는 것을 생각 하면 쉽다. Zoom 또는 Focus 조절 등을 Camera 통해 손쉽게 하는 것이라 생각 된다. 물론 실제 카메라가 아니기 때문에 유용한 점이 있다 예를 들면 사물(Object) 뒤에서 시점을 중심으로 바라보는 것도 가능하다.

 

Viewport (화상 표시영역) : 카메라가 바라보는 결과물이다. 카메라의 렌즈와 비교되어질 있는데, 시점을 멀리 잡으면 많은 부분이 보이며, 가깝게 잡으면 적은 부분 또는 일부가 잘려 우리 눈에 보여지는 것과 유사 하다.

 

3D Objects : 3D오브젝트는 Sprite MovieClip 진화한 형태로써 기존 x,y 2개의 축에서 z 하나가 추가되어 평면에서 공간을 표현한 것이라 있다.

 

Material : Object 위에 프린트되는 texture(질감) 이다. 건물과 비교하면 철근형태에서 시멘트를 발라 외형을 표현한 것이라 있다. Material 단순한 색상에서 진화된 형태로는 실시간 스트리밍 비디오까지도 사용할 있다.

 

Render engine : 카메라를 돌리면서 연속적으로 관찰하는 것과 유사하다. 렌더링을 시작 하면 Camera Viewport 연속적으로 변화하며 해당 정보를 보여주는 것이다. 렌더링은 실제로 새로운 이미지가 생성되는 것이 아니라 해당 Object 변경된 위치를 연산하여 Viewport 통해 보여주는 것이다.

 

Left-handed Cartesian coordinate system
(
왼손 좌표  시스템)

: PV3D 왼손 좌표 시스템을 도입하고 있다. 스테이지 기준(좌측 상단)으로 X 증가 Object 오른쪽으로 이동하며, Y 증가 아래쪽으로 이동시키며, Z값은 Object Depth(깊이) 조절한다.



3D를 손쉽게 하기 위해서 오늘부터 PV3D를 공부하기 시작했다.
여기 나오는 글은 기본적으로 Papervision3D Essentials 을 읽고 해당 내용을 발췌하여 정리한 것임을 알린다.

(원서는 늘 느끼지만.. 빡셈 후후 -_-)
 

최신버전 다운로드 ( zip, swc, svn 원하는 형태로 받음 )


DOWN :
http://code.google.com/p/papervision3d/

SVN : http://papervision3d.googlecode.com/svn/trunk/as3/trunk

 

=> SWC 컴파일된 파일이므로 컴파일 필요가 없음

=> ZIP 소스를 확인 있으며 수정 가능.

=> SVN 최신 버전을 유지할 있음. (ZIP 소스가 상대적으로 좀더 안정적임)

 

FLEX에서 다운 받은 zip 파일 또는 swc 파일 적용하는 방법

 

1. 프로젝트에서 클릭 - Properties 선택

2. Flex Build Path 선택

 

. Zip 파일을 다운 받은 경우

=> 압축해제 , Source Path 탭에서 Add Folder 선택하여 압축 해제한 폴더를 선택




. Swc 파일을 다운 받은 경우

=> Library path 선택한 이후 Add SWC 선택하여 해당 swc 선택



+ Recent posts