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 ):void:3×3矩陣相乘
public static function multiply3x3( a:Matrix3D, b:Matrix3D ):Matrix3D:3×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 ):Matrix3D:ref-參考點
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":告訴Mesh3D的render()方法如何排序
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:渲染
moveForward(distance: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可以為DisplayObject3D或Matrix3D)
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 ):void:world 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 :Array:MESH的面
vertices :Array:頂點
transformVertices(transformation:Matrix3D):貌似未實現
(2)方法:
transformUV( material:MaterialObject3D ):void:
getBoundingSphere2():Number
9.proto. MaterialObject3D
MaterialObject3D類:繼承自EventDispatcher,所有材質的基類。是抽象基類,故不能實例化
(1)屬性:
bitmap :BitmapData:透明或不透明的BitmapData紋理
smooth :Boolean:繪制BitmapData紋理時是否要平滑
lineColor :Number:面的outline的RGB顏色
lineAlpha :Number:面的outline的8位的alpha值(若為0,則不繪制outline)
fillColor :Number:面的填充顏色(只有無紋理時才有效)
fillAlpha :Number:alpha值(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 = 8:mipmap等級
get texture():* //texture object
set texture( asset:* ):void
(2)方法
createBitmap( asset:* ):BitmapData:創建位圖
correctBitmap( bitmap :BitmapData, dispose :Boolean ):BitmapData:CORRECT 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 :Boolean:MovieClip是否透明,默認為false(這樣很快)
get animated():Boolean:紋理是否是動畫
set animated( status:Boolean ):void
(2)方法
updateBitmap():void:更新動畫的MovieClip的bitmap
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 = 1:gridX的默認值
(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.