<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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技術??s放時就設為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:默認大小(若無紋理)

           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 閱讀(1014) 評論(0)  編輯  收藏 所屬分類: Flex+ActionScript
    主站蜘蛛池模板: 免费毛片网站在线观看| 亚洲AV午夜成人影院老师机影院| 羞羞漫画小舞被黄漫免费| 亚洲国产V高清在线观看| 在线成人精品国产区免费| 亚洲视频无码高清在线| 国产精品亚洲mnbav网站 | a级毛片免费完整视频| 亚洲国产成人超福利久久精品| 国产免费观看视频| 2019中文字幕免费电影在线播放| 国产亚洲精品AAAA片APP| 亚洲国产日韩一区高清在线| 日韩中文无码有码免费视频| 青青草无码免费一二三区| 国产亚洲视频在线观看| 亚洲精品国产情侣av在线| 亚洲欧洲一区二区三区| 久久久高清免费视频| 中国一级毛片视频免费看| 亚洲欧美日韩自偷自拍| 亚洲人成网站影音先锋播放| 亚洲Av无码国产情品久久 | 免费国产小视频在线观看| 2021在线观看视频精品免费| yellow免费网站| 亚洲hairy多毛pics大全| 亚洲精品国产啊女成拍色拍| 最新亚洲成av人免费看| 日韩成人免费aa在线看| h片在线免费观看| 黄色免费在线网站| 一级特级aaaa毛片免费观看| 亚洲国产精品美女久久久久| 亚洲人成在线播放| 亚洲黑人嫩小videos| 亚洲AV综合色一区二区三区| 亚洲精品在线视频| 尤物永久免费AV无码网站| 扒开双腿猛进入爽爽免费视频 | 亚洲精品久久无码av片俺去也|