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 선택



[계속 확인하면서 작성중인 내용임 - 업뎃 될때마다 갱신됨]
최근 수정일 : 09.08.30
-----------------------------------------------------


1. Scroll 바의 분리

스크롤바가 기본 컴포넌트에서 탈부착이 가능 한 형태로 바뀌게 되었다. 이로써 가벼워 진것은 사실임 후후
하지만.. 중요한것은 기본 컴포넌트에서 스크롤바가 없어짐에 따라 컴포넌트의 사용 방법도 많이 바뀌었다는것 -_-;
자동 스크롤 구현시 verticalScrollPosition 이것으로 스크롤 조절 했었는데... 기본컴포넌트에서 제거가 되었으니 뭐 크.. 역시 사용방법에 익숙치 않은것이 문제죠 ... 그래서 TextArea 대신 신규로 등장한 RichTextArea를 써보고 있음.

2. Slider의 변화

슬라이더에서도 많은 변화가 발생했다. 기본 최대값이 기존 10 => 100으로 변경되었고.. 툴팁 색상도 기존 아이보리색에서 검정색으로 바뀌었고(뭐 중요한건 아닌거 같지만.. 무튼) 또한 allowTrackClick 이라는 프로퍼티가 스파크에서는 사라짐 아... 그래서 현재는 mx꺼 쓰고 있는중... 사용방법에 익숙하지 않으니 뭐 ... 시간좀 걸릴거 같다.

3. state의 비중 증가

기존 3 버전에서도 state도 존재 하였지만 쓴적이 -_-; 하지만 이번 버전에서는 그 비중이 높아졌다. 스킨/이펙트 등을 동적으로 적용함에 있어 state를 사용하면 손쉽게 바꿀 수 있었으니... 참 좋아진거 같다. 하지만 뭐 이것도 아직은 많이 안써봤는지라 ;;

4. addChild 물러꺼라 ~ addElement 가 새롭게 등장하였도다 !

' 스킨 ' 이 강조 됨에 따라 addElement라는 메소드가 등장하였다. 스킨화 작업을 위해서는 기존 addChild 대신 addElement를 사용해야 한다. 아.. 이것도 익숙해 져야 되는구나 ㅜㅜ

5. 버튼의 한글 깨짐 현상

■ 와 같은 특수 문자를 표현할 경우 <mx:Button /> (0) <s:Butoon /> (X)
스파크에서는 ? 로 표현된다 -_-; 아.. 한글깨짐 현상... 정식버전 언제 나올지는 모르겠지만... 문제가 해결되어 나왔음 좋겠다.




블랙젝 - 카드게임 입니다.
: 별로 할 일이 없는지라 틈틈히 해서 만들어 봤습니다. 뭐 약간의 버그도 있는거 같기도 한데.. 뭐 대충 -_-;





하는 방법
: 21에 가까우면 이기는 거임, 21 넘어가면 짐. 끝 -_-;

FLEX로 만들어 본 MP3 플레이어 입니다.
[ 수정 일지 ]

09.08.21 첨 만들어서 공개 -_-; (소스정리고 뭐고 없음 크.... )

[ 스크린 샷 ]


[ 스크린 샷 ]

만들어야 될것

1. 이전, 다음 재생
2. 랜덤 재생
3. 스펙트럼(파동?) 구현
4. 팬(좌우 음량대역 조절) <- 빼도 될듯...
5. DB연동 (로그인, mySql ... 필요하겠네요)

그 외에도 아직 많이 더 추가를 해야 될거 같네요 ^^;

+ Recent posts