Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          PV3D是一個很著名的Flash 3D免費開源引擎,功能很強大,效率也可以。官方網站是http://www.papervision3d.org/,源代碼下載地址是http://code.google.com/p/papervision3d/。目前最新版本是2.0a(Greate White)。下面對PV3D 1.5版進行簡單的源代碼分析,希望對學習PV3D的同志能有所幫助。

          下圖是PV3D 1.5的引擎類圖(截自于一韓國網友的博客):


          以下是我去年看PV3D 1.5引擎源代碼時所做的簡單的分析,由于是直接從WORD文件上拷貝到博客上,所以排版可能不是很美觀,還請見諒 :)

          ---------------------------------------------------------------華麗的分割線--------------------------------------------------------

           

          一、Papervision3D.as

          一些全局設置,還有log函數

          二、core

          1.Number3D.as

          Number3D類:3D坐標系中的一個值
          1)屬性:x,y,z:Number:浮點數

          2)方法:clone()

                               modulo():長度

                               add()

                               sub()

                               dot()

                               cross()

                               normalize()

                               get ZERO():(0,0,0)

                               toString()

          2. NumberUV.as

          NumberUV類:UV坐標系中的一個值

          1)屬性:u,v:Number

          2)方法:clone()

                               get ZERO()

                               toString()

          3. Matrix3D.as

          Matrix3D類:4×3矩陣
          import flash.geom.Matrix;

          1)屬性:n11,n12,n13,n14,

                               n21,n22,n23,n24,

                               n31,n32,n33,n34

          2)方法:IDENTITY()

                               toString()

                               calculateMultiply( a:Matrix3D, b:Matrix3D ) :void:矩陣a和矩陣b相乘

          multiply( a:Matrix3D, b:Matrix3D ):Matrix3D:矩陣a和矩陣b相乘,返回值為結果

                               calculateMultiply3x3 ( a:Matrix3D, b:Matrix3D ):void3×3矩陣相乘

          public static function multiply3x3( a:Matrix3D, b:Matrix3D ):Matrix3D3×3矩陣相乘,返回值為結果

          calculateAdd( a:Matrix3D, b:Matrix3D ):void

          public static function add( a:Matrix3D, b:Matrix3D ):Matrix3D

          public function calculateInverse( m:Matrix3D ):void

          public static function inverse( m:Matrix3D ):Matrix3D:逆

          get det():行列式(3×3)

          get trace()

          copy( m:Matrix3D ):Matrix3D

          copy3x3( m:Matrix3D ):Matrix3D

          clone( m:Matrix3D ):Matrix3D

          multiplyVector( m:Matrix3D, v:Number3D ):void

          multiplyVector3x3( m:Matrix3D, v:Number3D ):void

          rotateAxis( m:Matrix3D, v:Number3D ):void

          rotationX( rad:Number ):Matrix3D

          rotationY( rad:Number ):Matrix3D

          rotationZ( rad:Number ):Matrix3D

          rotationMatrix( x:Number, y:Number, z:Number, rad:Number ):Matrix3D

          rotationMatrixWithReference( axis:Number3D, rad:Number, ref:Number3D ):Matrix3Dref-參考點

          translationMatrix( x:Number, y:Number, z:Number ):Matrix3D

          scaleMatrix( x:Number, y:Number, z:Number ):Matrix3D

          static private var toDEGREES :Number = 180/Math.PI;

          static private var toRADIANS :Number = Math.PI/180;

          4.proto. DisplayObjectContainer3D

          DisplayObjectContainer3D類:繼承自EventDispatcher,可作為DisplayObject3D容器的所有對象的基類。每個DisplayObjectContainer3D對象有自己的child list

          1)屬性:

                 protected var _children       :Dictionary; //children作為索引的名字列表

                 protected var _childrenByName :Object; //以名字作為索引的children列表

                 private   var _childrenTotal :int;    // children數目

          5.objects.DisplayObject3D(不屬于core,屬于objects?。。。?/span>

          DisplayObject3D類:繼承自DisplayObjectContainer3D,表示場景中的3D對象(也包括攝像機和其目標)

          提供x,y,z,rotationX,rotationY,rotationZ,scaleX,scaleY.scaleZ,visible,transform Matrix3D

          (1)屬性:visible:Boolean:是否可見
                  name:String:對象名(可選)

                        id:int:對象標識

                        extra :Object:包含用戶定義屬性的對象

                        container   :Sprite:繪制到的sprite

                        material    :MaterialObject3D:材質

                        materials   :MaterialsList:材質列表

                        scene :SceneObject3D:對象所屬的場景

                        parent :DisplayObjectContainer3D:包含該對象的容器(只讀)

                        MESH_SORT_CENTER:String = "meshSortCenter":告訴Mesh3Drender()方法如何排序

                        MESH_SORT_FAR:String = "meshSortFar"

                        MESH_SORT_CLOSE:String = "meshSortClose"

                        相對方向:
                        static private var FORWARD :Number3D = new Number3D( 0, 0, 1 );

                        static private var BACKWARD :Number3D = new Number3D( 0, 0, -1 );

                        static private var LEFT     :Number3D = new Number3D( -1, 0, 0 );

                        static private var RIGHT    :Number3D = new Number3D( 1, 0, 0 );

                        static private var UP       :Number3D = new Number3D( 0, 1, 0 );

                        static private var DOWN     :Number3D = new Number3D( 0, -1, 0 );
                        由此可見,PV3D的坐標系是左手系(和D3D一樣)

                        transform :Matrix3D:變換矩陣(scaling,translation,rotation

                        var view      :Matrix3D:攝像機變換矩陣

                        projected :Dictionary

                        faces     :Array = new Array():面

                        geometry :GeometryObject3D:包含該對象的3D幾何定義(instances:不同的對象共享相同的幾何形體,也就是相同的對象顯示多次,instance技術可以節省內存)

                        screenZ :Number:變換后的物體中心的深度值(Z坐標),也就是到camera的距離。

          2)方法:

                 addGeometry( geometry:GeometryObject3D=null ):void:增加幾何定義

                 distanceTo( obj:DisplayObject3D ):Number:與obj的距離
                 hitTestPoint( x:Number, y:Number, z:Number ):Boolean:是否與指定點相交(與物體的邊界球的半徑相比較)

                 hitTestObject( obj:DisplayObject3D, multiplier:Number=1 ):Boolean:與obj是否相交(邊界球),multiplier-邊界球組(貌似還沒實現)

                 getMaterialByName( name:String ):MaterialObject3D:獲得材質

                 materialsList():String:材質列表中的材質名
                 project( parent :DisplayObject3D, camera :CameraObject3D, sorted :Array=null ):Number:投影

                 render( scene :SceneObject3D ):void:渲染

                 moveForwarddistance:Number

                 moveBackward()

                 moveLeft()

                 moveRight()

                 moveUp()

                 moveDown()

                 translate( distance:Number, axis:Number3D ):void:沿給定方向移動物體

                 pitch( angle:Number ):void:(繞X軸旋轉)

                 yaw( angle:Number ):void:偏航角(繞Y軸旋轉)

                 roll( angle:Number ):void:繞Z軸旋轉

                 lookAt( targetObject:DisplayObject3D, upAxis:Number3D=null ):void:讓物體看著某一指定位置(upAxis:向上方向,一般是Y軸正向)

                 copyPosition( reference:* ):void:拷貝位置(reference可以為DisplayObject3DMatrix3D

                 copyTransform( reference:* ):void:拷貝變換矩陣

                 updateTransform():void:更新變換矩陣

          內部使用的屬性:
          protected var _transformDirty :Boolean = false; //Dirty技術。變換時就設為true

                 private var _rotationX      :Number;

                 private var _rotationY      :Number;

                 private var _rotationZ      :Number;

                 private var _rotationDirty :Boolean = false; //Dirty技術。旋轉時就設為true

                 private var _scaleX         :Number;

                 private var _scaleY         :Number;

                 private var _scaleZ         :Number;

                 private var _scaleDirty     :Boolean = false; //Dirty技術。縮放時就設為true

                 protected var _sorted       :Array;

                 static private var _totalDisplayObjects :int = 0; // id

          6.proto.CameraObject3D
          CameraObject3D類:繼承自DisplayObject3D,所有攝像機的基類

          1)屬性:

          zoom :Number:要渲染的物體的縮放,值越大,則場景就放大,距離就縮小,將它與focus一起使用
          focus :Number:正數,表示觀察者到近平面的距離,這是任何物體與camera的最近距離,將它與zoom一起使用(高focus值可以放大物體之間的距離,這樣就可以允許更大的深度域,模擬廣角鏡的效果,或魚眼)

          sort :Boolean:渲染時物體是否排序

          var DEFAULT_POS :Number3D = new Number3D( 0, 0, -1000 ):新攝像機的默認位置

          2)方法:

          transformView( transform:Matrix3D=null ):voidworld space--->camera space

          _flipY :Matrix3D = Matrix3D.scaleMatrix( 1, -1, 1 ); //y值倒轉

          tilt( angle:Number ):void:攝像機繞x軸轉動
          pan( angle:Number ):void:攝像機繞y軸轉動

          7.proto. SceneObject3D(場景管理)

          SceneObject3D類:繼承自DisplayObjectContainer3D,是所有場景的基類

          場景是放置物體的地方,它包含3D環境

          場景管理所有渲染的物體,它擴展了DisplayObjectContainer3D類來分配顯示物體

          SceneObject3D是抽象基類,因此不能實例化

          1)屬性:
          container :Sprite:你繪制到的地方

          geometries :Dictionary:場景中的幾何體列表

          stats :Object:總體和當前統計信息(points,polys,triangles,performance,rendered

          objects :Array:場景中的物體列表

          materials :MaterialsList:場景中的材質列表

          2)方法:

          addChild( child:DisplayObject3D, name:String=null ):DisplayObject3D

          removeChild( child:DisplayObject3D ):DisplayObject3D

          renderCamera( camera :CameraObject3D ):void:渲染,流程如下:
                 <1> Render performance stats;

                 <2> Materials: MovieMaterial.updateAnimatedBitmaps();

                 <3> 3D projection:
                  1> Transform camera: camera.transformView();

                        2> Project objects:

                 <4> Z sort: this.objects.sortOn( 'screenZ', Array.NUMERIC );

                 <5> Render objects: renderObjects( camera.sort );

          8.proto. GeometryObject3D

          GeometryObject3D類:繼承自EventDispatcher,包含一對象的MESH定義

          1)屬性:
          material: MaterialObject3D:材質

          materials:材質列表

          boundingSphere2:邊界球半徑的平方

          faces    :ArrayMESH的面

          vertices :Array:頂點

          transformVerticestransformation:Matrix3D):貌似未實現

          2)方法:
          transformUV( material:MaterialObject3D ):void

          getBoundingSphere2():Number

          9.proto. MaterialObject3D

          MaterialObject3D類:繼承自EventDispatcher,所有材質的基類。是抽象基類,故不能實例化

          1)屬性:

          bitmap :BitmapData:透明或不透明的BitmapData紋理

          smooth :Boolean:繪制BitmapData紋理時是否要平滑

          lineColor :Number:面的outlineRGB顏色

          lineAlpha :Number:面的outline8位的alpha值(若為0,則不繪制outline

          fillColor :Number:面的填充顏色(只有無紋理時才有效)

          fillAlpha :Numberalpha值(8位)

          get doubleSided():是否雙面shade

          oneSide :Boolean:是否單面shade

          invisible :Boolean:是否不可見(不畫)

          opposite :Boolean:是否相反(只用于雙面shade

          scene :SceneObject3D:所屬的scene

          static public var DEFAULT_COLOR :int = 0x000000;:材質的默認顏色(黑色)

          static public var DEBUG_COLOR :int = 0xFF00FF;DEBUG材質的顏色

          name :String:材質名

          id :Number:材質ID

          maxU :Number

          maxV :Number

          geom目錄

          10. Vertex2D類:2D projected vertices

          1)屬性:

                 x,y,z

                 extra:Object

                 visible :Boolean:設置該頂點在經過投影后是否可見。若為false,則表示該頂點在攝像機平面的后面

          11. Vertex3D類:3D頂點

          10

          12. Vertices3D類:繼承自DisplayObject3D類,頂點組

          方法:
          project( parent :DisplayObject3D, camera :CameraObject3D, sorted :Array=null ):Number:將3d坐標投影到2d平面

          boundingBox():Object:計算包圍盒,返回{minX, maxX, minY, maxY, minZ, maxZ}

          transformVertices( transformation:Matrix3D ):void:變換頂點

          13. Mesh3D類:繼承自Vertices3D類,創建和顯示由頂點和三角形組成的3D物體

          方法:
          project( parent :DisplayObject3D, camera :CameraObject3D, sorted :Array=null ):Number

          projectTexture( u:String="x", v:String="y" ):void:從指定平面的平面投影(u-紋理水平軸,v-紋理垂直軸)

          14. Face3D類:渲染線性采樣的紋理貼圖的三角形,也支持顏色填充和輪廓線(繪制代碼就在這里?。。。?/span>

          1)屬性:

          vertices :Array:一個三角形的3個頂點

          materialName :String:材質名

          uv :Array:每個三角形頂點的UV坐標

          screenZ :Number:轉換后的三角形的平均深度

          visible :Boolean:面是否可見

          id :Number:面ID

          存儲三角形頂點的引用:

          private var v0:Vertex3D;

                 private var v1:Vertex3D;

                 private var v2:Vertex3D;

          2)方法:

          transformUV( instance:DisplayObject3D=null ):Matrix:應用更新后的UV紋理映射值到三角形上,這用來加速渲染

          render( instance:DisplayObject3D, container:Sprite ): Number:渲染三角形

          渲染流程:

          <1>.內部

          有紋理:

          graphics.beginBitmapFill( texture, _localMatrix, true, material.smooth);

          無紋理:

          graphics.beginFill( material.fillColor, fillAlpha );

          <2>.輪廓線

          lineAlpha>0

          graphics.lineStyle( 0, material.lineColor, lineAlpha );

          lineAlpha=0

          graphics.lineStyle();

          <3>.畫三角形

          // Draw triangle

          graphics.moveTo( x0, y0 );

          graphics.lineTo( x1, y1 );

          graphics.lineTo( x2, y2 );

          <4>.顯示出來

          graphics.lineTo( x0, y0 ); //畫輪廓線

          graphics.endFill(); //顯示三角形

          三、cameras

          1. Camera3D類:繼承自CameraObject3D類,creates a camera that views the area around a target object

          1)屬性

                 target :DisplayObject3D:目標

                 goto :Number3D:指定camera要去的位置

          2)方法

                 transformView( transform:Matrix3D=null )world space--->camera space

                 hover( type:Number, mouseX:Number, mouseY:Number ):void:用戶移動鼠標時移動camera

          2. FreeCamera3D類::繼承自CameraObject3D類。creates a camera that views the area in the direction the camera is aimed

          1)方法

                 transformView( transform:Matrix3D=null ):void

          四、scenes

          1. Scene3D類:繼承自SceneObject3D類。create a scene where all objects are rendered in the same container

          1)方法:

                 renderObjects( sort:Boolean ):void

          2. FlexScene3D類:繼承自Scene3D類。

          private var containerList : Array;

                        private var spriteList : Dictionary;

          3. MovieScene3D類:繼承自Scene3D類。create a scene where each object is rendered in its own container(注意與Scene3D類的不同)

          1)方法:

          addChild( child :DisplayObject3D, name :String=null ):DisplayObject3D

          getSprite(child:DisplayObject3D):Sprite

          renderObjects( sort:Boolean ):void

          五、events

          1. FileLoadEvent類:繼承自event類。represents events that are dispatched when files are loaded

          public class FileLoadEvent extends Event

                 {

                        public static var LOAD_COMPLETE :String = "loadComplete"; //加載完畢

                        public static var LOAD_ERROR    :String = "loadError"; //加載錯誤

                        public static var COLLADA_MATERIALS_DONE:String = "colladaMaterialsDone";

          //collada材質加載完畢

                        public var file:String;

                        public function FileLoadEvent( type:String, p_file:String="", bubbles:Boolean=false, cancelable:Boolean=false )

                        {

                               super( type, bubbles, cancelable );

                               file = p_file;

                        }

                 }

          六、materials

          1. BitmapMaterial類:繼承自MaterialObject3D類。creates a texture from a BitmapData object

          1)屬性

                 AUTO_MIP_MAPPING :Boolean = true;:是否mipmap

                 MIP_MAP_DEPTH :Number = 8mipmap等級

                 get texture():* //texture object

                 set texture( asset:* ):void

          2)方法

                 createBitmap( asset:* ):BitmapData:創建位圖

                 correctBitmap( bitmap :BitmapData, dispose :Boolean ):BitmapDataCORRECT BITMAP FOR MIP MAPPING

                 extendBitmapEdges( bmp:BitmapData, originalWidth:Number, originalHeight:Number )

          2. ColorMaterial類:繼承自MaterialObject3D類。creates a solid color material

          public function ColorMaterial( color:Number=0xFF00FF, alpha:Number = 100, initObject:Object=null )

                 {

                        super( initObject );

                        this.fillColor = color; //填充顏色

                        this.fillAlpha = alpha; //

                 }

          3. WireframeMaterial類:繼承自MaterialObject3D類。creates a wireframe material, where only the outlines of the faces are drawn.

          public function WireframeMaterial( color:Number=0xFF00FF, alpha:Number=100, initObject:Object=null )

                 {

                        super( initObject );

                        this.lineColor   = color; //線顏色

                        this.lineAlpha   = alpha; //

                        this.doubleSided = true;

                 }

          4. BitmapAssetMaterial類:繼承自BitmapMaterial類。creates a texture from a Bitmap library symbol

          createBitmap( asset:* ):BitmapData

          5. BitmapFileMaterial類:繼承自BitmapMaterial類。creates a texture by loading a bitmap from an external file.

          1)屬性

                 var url :String = ""The URL that has been requested.

                 loaded :Boolean:紋理是否已被加載

                 callback :Function:上張圖片被加載完的回調

                 LOADING_COLOR :int = MaterialObject3D.DEFAULT_COLOR;:加載完成前材質的顏色

          2)方法

          public function BitmapFileMaterial( url :String, initObject :Object=null )

                 {

                        super( url, initObject );

                        this.url = url;

                        this.loaded = false;

                        // Loading color

                        this.fillAlpha = 1;

                        this.fillColor = LOADING_COLOR;

                 }

          BitmapFileMaterial類就是將外部圖片文件加載進flash Bitmap library。

          6. MaterialsList類:材質列表

          1)屬性

                 materialsByName :Dictionary:以name索引的材質列表

                 get numMaterials():int:孩子的數目

                 【內部使用】

                        _materials       :Dictionary

                        _materialsTotal :int

          2)方法:

                 addMaterial( material:MaterialObject3D, name:String=null ):MaterialObject3D

                 removeMaterial( material:MaterialObject3D ):MaterialObject3D

                 getMaterialByName( name:String ):MaterialObject3D

                 removeMaterialByName( name:String ):MaterialObject3D

                 clone():MaterialsList

          7. MovieMaterial類:繼承自BitmapMaterial類。creates a texture from an existing MovieClip instance

          該紋理可以是動畫的和/或者透明的。MovieClip實例的當前的縮放和顏色值將會被使用,但旋轉則會被舍棄。

          MovieClip的內容需要放在注冊點(the registration point)的左上角

          1)屬性

          movie :MovieClip:用作紋理的MovieClip

          movieTransparent :BooleanMovieClip是否透明,默認為false(這樣很快)

          get animated():Boolean:紋理是否是動畫

          set animated( status:Boolean ):void

          2)方法
          updateBitmap():void:更新動畫的MovieClipbitmap

          createBitmap( asset:* ):BitmapData

          updateAnimatedBitmaps():void:更新所有的動畫MovieMaterial實例的bitmap

          8. VideoStreamMaterial類:繼承自MovieMaterial類。creates a texture from an existing Video instance and is for use with a Video and NetStream objects with an RTMP stream. The texture can be animated and/or transparent.

          1)屬性

                 stream:NetStream:用作紋理的NetStream

                 video:Video:用做紋理的Video

          2)方法

                 initMaterial ( video:Video, stream:NetStream ):void

                 createBitmap( asset:* ):BitmapData

                 updateBitmap ():void

                 onStreamStatus ( event:NetStatusEvent ):void:當NetStream對象狀態改變時執行

          9. MovieAssetMaterial類:繼承自MovieMaterial類。creates a texture from a MovieClip library symbol

          七、objects

          1.Plane類:繼承自Mesh3D類。create and display flat rectangle objects

          長方形可以劃分為更小的segment。這通常用來減少線性采樣貼圖的失真

          在透視的方向上切分平面可以改善這個問題

          1)屬性

                 segmentsW :Number:水平方向的segment

                 segmentsH :Number:垂直方向的segment

                 DEFAULT_SIZE :Number = 500:默認大?。ㄈ魺o紋理)

                 DEFAULT_SCALE :Number = 1:默認縮放(若無紋理)

                 DEFAULT_SEGMENTS :Number = 1gridX的默認值

          2)方法

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

          特別說明一下參數width

          [optional] - Desired width or scaling factor if there's bitmap texture in material and no height is supplied.

          參數width一般是寬度。但如果有紋理并且沒指定height參數,則參數width是縮放因子

          buildPlane( width:Number, height:Number ):void:構建平面(1個格子2個三角形)

          2. PaperPlane類:繼承自Mesh3D類。Paper planes are useful for testing, when you want to know the direction an object is facing.

          -------------------------------------------------------------------------
          什么叫真?你怎樣給真下定義,如果你說真就是你能感覺到的東西,你能聞到的氣味,你能嘗到的味道,那么這個真就是你大腦作出反應的電子信號。

          posted on 2008-11-17 16:19 seal 閱讀(1018) 評論(0)  編輯  收藏 所屬分類: Flex+ActionScript
          主站蜘蛛池模板: 奎屯市| 常宁市| 林口县| 隆子县| 筠连县| 乡宁县| 蓝山县| 中阳县| 齐河县| 师宗县| 松原市| 贵德县| 徐汇区| 广德县| 孟州市| 密山市| 崇明县| 北宁市| 合作市| 巨鹿县| 金坛市| 吴忠市| 安龙县| 江西省| 澳门| 古蔺县| 会宁县| 兴安盟| 吉木乃县| 西和县| 樟树市| 景宁| 淅川县| 台北县| 韶山市| 双牌县| 宕昌县| 日土县| 高碑店市| 托克托县| 颍上县|