如大家要转载,请保留本人的版权:
/*
*Description:PV3D类继承体系结构
*Auther:崇崇-天真的好蓝啊
*MSN:chongchong2008@msn.com
*Blog:chongchong2008
*Dates:2009-06-02
*Copyright:ChongChong2008 YiChang HuBei China
*/
对AS3感兴趣的朋友,可以看我的上一篇基础文章"ActionScript开发注意事项! ",下面的内容是关于PV3D的。
pv 3D Demo在这里浏览:
[flash]http://www.yc330.net/site/flash/pv3d.swf[/flash]
一 PV3D类内部结构惯用手法
1。关于Dictionary的使用
自定义容器类型对象中以下关于Dictionary的用法,在MaterialsList类中也是类似的手法处理子对象集合。
public class DisplayObjectContainer3D extends EventDispatcher
{
public var root :DisplayObjectContainer3D;
protected var _childrenByName:Object;
protected var _children:Dictionary;
private var _childrenTotal:int;
public function DisplayObjectContainer3D():void{
this._children = new Dictionary( false ); //弱引用为false
this._childrenByName = new Dictionary( true ); //弱引用为true
this._childrenTotal = 0;
}
public function get numChildren():int{
return this._childrenTotal;
}
public function get children():Object{
return this._childrenByName;
}
public function addChild( child :DisplayObject3D, name:String=null ):DisplayObject3D{
name = name || child.name || String( child.id );
this._children[ child ] = name; //以对象为键,存储String对象
this._childrenByName[ name ] = child; //以字符名字为键,存储DisplayObject3D对象
this._childrenTotal++;
child.parent = this;
child.root = this.root;
return child;
}
public function addChildren( parent :DisplayObject3D ):DisplayObjectContainer3D{
for each( var child:DisplayObject3D in parent.children ){
parent.removeChild( child );
this.addChild( child );
}
return this;
}
public function removeChild( child:DisplayObject3D ):DisplayObject3D{
delete this._childrenByName[ this._children[ child ] ];
delete this._children[ child ];
child.parent = null;
child.root = null;
return child;
}
public function getChildByName( name:String ):DisplayObject3D{
return this._childrenByName[ name ];
}
public function removeChildByName( name:String ):DisplayObject3D{
return removeChild( getChildByName( name ) );
}
}
2。关于自定义事件封装
public class DebugEvent extends Event{
public var obj:Object = new Object();
public function DebugEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false, p_obj:Object):void{
super(type, bubbles, cancelable);
obj = p_obj;
}
}
public class DebugDispatcher extends EventDispatcher{
public static var TRACE:String = "trace";
public function sendEvent(eventName:String, obj:Object):void{
dispatchEvent(new DebugEvent(DebugDispatcher.TRACE, false, false, obj));
}
}
3。关于ActionScript3反射
flash.uitls包里的describeType方法,方法原形如下:
XML describeType(类型的实例 || 类型本身)
返回描述ActionScript对象的XML对象,该XML对象结构在flash help的解释如下:
<type>
XML对象的根标签,该节点有如下属性:
name :ActionScript 对象的数据类型的名称。
base :ActionScript 对象的定义类的直接超类。 如果 ActionScript 对象是类对象,则值为 Class。
isDynamic:如果 ActionScript 对象的定义类是动态的,则为 true;否则为 false。 如果 ActionScript 对象是类对象,则值为 true,因为 Class 类是动态的。
<extendsClass>
ActionScript对象的定义类的每个超类,该节点有如下属性:
type :ActionScript对象的定义类扩展的超类的名称。
<implementsInterface>
ActionScript对象的定义类或其任何超类实现的每个接口都有一个单独的 implementsInterface 标签,该节点有如下属性:
type :ActionScript对象的定义类实现的接口的名称。
<accessor>
存取器是 getter 和 setter 函数定义的一个属性,该节点有如下属性:
name :存取器的名称。
access :属性的访问权限。 可能的值包括 readonly、writeonly 和 readwrite。
type :属性的数据类型。
<constant>
常量是用 const 语句定义的一个属性,该节点有如下属性:
name :常量的名称。
type :常量的数据类型。
<method>
方法是作为类定义的一部分声明的函数,该节点有如下属性:
name :方法的名称。
declaredBy :包含方法定义的类。
returnType :方法的返回值的数据类型。
<parameter>
方法定义的每个参数都有一个单独的 parameter 标签。 此标签始终嵌套在 <method> 标签内,该节点有如下属性:
index :一个数字,对应于参数在方法的参数列表中出现的顺序。 第一个参数的值为 1。
type :参数的数据类型。
optional :如果参数是可选参数,则为 true;否则为 false。
<variable>
变量是用 var 语句定义的一个属性,该节点有如下属性:
name :变量的名称。
type :变量的数据类型。
<factory>
如果 ActionScript 对象是类对象或构造函数,则所有实例属性和方法均嵌套在此标签内。 如果 <type> 标签的 isStatic 属性为 true,则未嵌套在 <factory> 标签内的所有属性和方法都是静态的。 只有在 ActionScript 对象是类对象或构造函数时,此标签才会出现。
Example(来自PV3D的logger部分):
public class ObjectTools{
private static var log:XrayLog = new XrayLog();
public static function getFullClassPath(obj:Object):String{
var xmlDoc:XML = describeType(obj);
var ary:Array = [];
// add the className of the actual object
var className:String = getQualifiedClassName(obj);
className = className.indexOf("::") > -1 ? className.split("::").join(".") : className;
ary.push(className);
// loop the extendsClass nodes
for each(var item:XML in xmlDoc.extendsClass){
var extClass:String = item.@type.toString().indexOf("::") > -1 ? item.@type.toString().split("::")[1] : item.@type.toString();
ary.push(extClass);
}
// return the full path as dot separated
return ary.join(".");
}
public static function getImmediateClassPath(obj:Object):String{
var className:String = getQualifiedClassName(obj);
var superClassName:String = getQualifiedSuperclassName(obj);
className = className.indexOf("::") > -1 ? className.split("::").join(".") : className;
if(superClassName == null) return className;
superClassName = superClassName.indexOf("::") > -1 ? superClassName.split("::").join(".") : superClassName;
return superClassName + "." + className;
}
public static function getProperties(obj:Object):Array{
var ary:Array = [];
try{
var xmlDoc:XML = describeType(obj);
// loop the extendsClass nodes
for each(var item:XML in xmlDoc.variable){
var name:String = item.@name.toString();
var type:String = item.@type.toString();
var value:Object = obj[name] != null ? obj[name] : "";
ary.push({name:name, type:type, value:value});
//log.debug("my object", item.@type.toString());
}
}catch(e:Error){
}
// return the full path as dot separated
return ary;
}
}
二 PV3D类继承体系
PV3D虽然没有直接定义接口,但是在org.papervision3d.core.proto包里定义的已Object3D结尾的类,有几个属于顶级基类,其他的类都派生于此。
1。PV3D核心类如下:
1.1 显示对象容器类:
DisplayObjectContainer3D直接继承自flash内部的EventDispatcher类,支持事件派发。
1.2 材质对象类:
MaterialObject3D直接继承自flash内部的EventDispatcher类,支持事件派发。
1.3 场景对象类:
SceneObject3D继承自DisplayObjectContainer3D,是3维场景对象类。
CameraObject3D继承自DisplayObject3D,是摄像机对象类。
PV3D的DisplayObject3D是继承自DisplayObjectContainer3D的,这个容易和flash的内置继承层次混淆,flash内置的DisplayObject不是容器,而PV3D的DisplayObject3D是容器。
flash的内置继承层次是DisplayObjectContainer是继承自InteractiveObject --> DisplayObject,flash的DisplayObjectContainer是支持鼠标交互的。
而PV3D的Mesh3D是不直接支持和鼠标交互的,如果需要和鼠标交互,需要在传给场景构造的参数container上订阅鼠标事件。
2。PV3D在日志和缓动部分引用其他开源的包,如下:
com.blitzagency.xray.logger
caurina.transitions
3。PV3D类继承层次如下:
3.1 3D容器
DisplayObjectContainer3D --> EventDispatcher
3.2 场景相关
SceneObject3D --> DisplayObjectContainer3D --> EventDispatcher
Scene3D --> SceneObject3D --> DisplayObjectContainer3D --> EventDispatcher
MovieScene3D --> Scene3D --> SceneObject3D --> DisplayObjectContainer3D --> EventDispatcher
FlexScene3D --> Scene3D --> SceneObject3D --> DisplayObjectContainer3D --> EventDispatcher
3.3 摄像机
CameraObject3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Camera3D --> CameraObject3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
FreeCamera3D --> CameraObject3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
3.4 材质相关
MaterialObject3D --> EventDispatcher
ColorMaterial --> MaterialObject3D --> EventDispatcher
WireframeMaterial --> MaterialObject3D --> EventDispatcher
BitmapMaterial --> MaterialObject3D --> EventDispatcher
BitmapFileMaterial --> BitmapMaterial --> MaterialObject3D --> EventDispatcher
BitmapAssetMaterial --> BitmapMaterial --> MaterialObject3D --> EventDispatcher
MovieMaterial --> BitmapMaterial --> MaterialObject3D --> EventDispatcher
MovieAssetMaterial --> MovieMaterial --> BitmapMaterial --> MaterialObject3D --> EventDispatcher
VideoStreamMaterial --> MovieMaterial --> BitmapMaterial --> MaterialObject3D --> EventDispatcher
3.5 几何体,点,模型
GeometryObject3D --> EventDispatcher
DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Mesh3D --> Vertices3D
Ase --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Collada --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Cone --> Cylinder --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Cube --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
PaperPlane --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Plane --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Sphere --> Mesh3D --> Vertices3D --> DisplayObject3D --> DisplayObjectContainer3D --> EventDispatcher
Stars -- Vertex3D
3.6 事件
FileLoadEvent --> Event
3.7 独立类
Vertex2D
Vertex3D
Face3D
Number3D
NumberUV
Matrix3D
MaterialsList
4。PV3D内置对象
==============================================================
Number3D对象
==============================================================
所在包:org.papervision3d.core
所在文件:Number3D.as
描述:三维坐标点的运算。
构造方法:
public function Number3D( x: Number=0, y: Number=0, z: Number=0 )
字段:
public var x: Number;
public var y: Number;
public var z: Number;
属性:
public function get modulo():Number
public static function get ZERO():Number3D
方法:
public function normalize():void
public function clone():Number3D
public static function add( v:Number3D, w:Number3D ):Number3D
public static function sub( v:Number3D, w:Number3D ):Number3D
public static function dot( v:Number3D, w:Number3D ):Number
public static function cross( v:Number3D, w:Number3D ):Number3D
==============================================================
NumberUV对象
==============================================================
所在包:org.papervision3d.core
所在文件:NumberUV.as
构造方法:
public function NumberUV( u: Number=0, v: Number=0 )
字段:
public var u: Number;
public var v: Number;
属性:
public static function get ZERO():NumberUV
方法:
public function clone():NumberUV
public function toString(): String
==============================================================
Matrix3D对象
==============================================================
所在包:org.papervision3d.core
所在文件:Matrix3D.as
描述:3X4 和 3X3 矩阵运算
构造方法:
public function Matrix3D( args:Array=null )
字段:
public var n11 :Number;
public var n12 :Number;
public var n13 :Number;
public var n14 :Number;
public var n21 :Number;
public var n22 :Number;
public var n23 :Number;
public var n24 :Number;
public var n31 :Number;
public var n32 :Number;
public var n33 :Number;
public var n34 :Number;
属性:
public static function get IDENTITY():Matrix3D
public function get det():Number
实例方法:
public function calculateMultiply( a:Matrix3D, b:Matrix3D ):void
public function calculateMultiply3x3( a:Matrix3D, b:Matrix3D ):void
public function calculateAdd( a:Matrix3D, b:Matrix3D ):void
public function calculateInverse( m:Matrix3D ):void
public function copy( m:Matrix3D ):Matrix3D
public function copy3x3( m:Matrix3D ):Matrix3D
静态方法:
public static function multiply( a:Matrix3D, b:Matrix3D ):Matrix3D
public static function multiply3x3( a:Matrix3D, b:Matrix3D ):Matrix3D
public static function add( a:Matrix3D, b:Matrix3D ):Matrix3D
public static function inverse( m:Matrix3D ):Matrix3D
public static function clone( m:Matrix3D ):Matrix3D
public static function multiplyVector( m:Matrix3D, v:Number3D ):void
public static function multiplyVector3x3( m:Matrix3D, v:Number3D ):void
public static function rotateAxis( m:Matrix3D, v:Number3D ):void
public static function matrix2euler( t:Matrix3D ):Number3D
public static function euler2matrix( deg:Number3D ):Matrix3D
public static function rotationX( rad:Number ):Matrix3D
public static function rotationY( rad:Number ):Matrix3D
public static function rotationZ( rad:Number ):Matrix3D
public static function rotationMatrix( x:Number, y:Number, z:Number, rad:Number ):Matrix3D
public static function rotationMatrixWithReference( axis:Number3D, rad:Number, ref:Number3D ):Matrix3D
public static function translationMatrix( x:Number, y:Number, z:Number ):Matrix3D
public static function scaleMatrix( x:Number, y:Number, z:Number ):Matrix3D
public static function magnitudeQuaternion( q:Object ):Number
public static function normalizeQuaternion( q:Object ):Object
public static function axis2quaternion( x:Number, y:Number, z:Number, angle:Number ):Object
public static function euler2quaternion( ax:Number, ay:Number, az:Number ):Object
public static function quaternion2matrix( x:Number, y:Number, z:Number, w:Number ):Matrix3D
public static function multiplyQuaternion( a:Object, b:Object ):Object
==============================================================
Vertex2D对象
==============================================================
所在包:org.papervision3d.core.geom
所在文件:Vertex2D.as
构造方法:
public function Vertex2D( x:Number=0, y:Number=0, z:Number=0 )
字段:
public var x :Number;
public var y :Number;
public var z :Number;
public var extra :Object;
public var visible :Boolean;
==============================================================
Vertex3D对象
==============================================================
所在包:org.papervision3d.core.geom
所在文件:Vertex3D.as
构造方法:
public function Vertex3D( x:Number=0, y:Number=0, z:Number=0 )
字段:
public var x :Number;
public var y :Number;
public var z :Number;
public var extra :Object;
==============================================================
Face3D对象
==============================================================
所在包 :org.papervision3d.core.geom
所在文件:Face3D.as
构造方法:
public function Face3D( vertices:Array, materialName:String=null, uv:Array=null )
字段:
public var vertices :Array;
public var materialName :String;
public var uv :Array;
public var screenZ :Number;
public var visible :Boolean;
public var id :Number;
实例方法:
public function transformUV( instance:DisplayObject3D=null ):Matrix
/*渲染三角型,贴图*/
public function render( instance:DisplayObject3D, container:Sprite ): Number{
var projected :Dictionary = instance.projected;
var s0:Vertex2D = projected[v0];
var s1:Vertex2D = projected[v1];
var s2:Vertex2D = projected[v2];
var x0:Number = s0.x;
var y0:Number = s0.y;
var x1:Number = s1.x;
var y1:Number = s1.y;
var x2:Number = s2.x;
var y2:Number = s2.y;
var material :MaterialObject3D = ( this.materialName && instance.materials )? instance.materials.materialsByName[ this.materialName ] : instance.material;
// Invisible?
if( material.invisible ) return 0;
// Double sided?
if( material.oneSide )
{
if( material.opposite )
{
if( ( x2 - x0 ) * ( y1 - y0 ) - ( y2 - y0 ) * ( x1 - x0 ) > 0 )
{
return 0;
}
}else{
if( ( x2 - x0 ) * ( y1 - y0 ) - ( y2 - y0 ) * ( x1 - x0 ) < 0 )
{
return 0;
}
}
}
var texture :BitmapData = material.bitmap;
var fillAlpha :Number = material.fillAlpha;
var lineAlpha :Number = material.lineAlpha;
var graphics :Graphics = container.graphics;
if( texture )
{
var map :MatriĂ = instance.projected[ this ] || transformUV( instance );
_triMatrix.a = x1 - x0;
_triMatrix.b = y1 - y0;
_triMatrix.c = x2 - x0;
_triMatrix.d = y2 - y0;
_triMatrix.tx = x0;
_triMatrix.ty = y0;
_localMatrix.a = map.a;
_localMatrix.b = map.b;
_localMatrix.c = map.c;
_localMatrix.d = map.d;
_localMatrix.tx = map.tx;
_localMatrix.ty = map.ty;
_localMatrix.concat(_triMatrix);
graphics.beginBitmapFill( texture, _localMatrix, true, material.smooth); //位图填充
}else if( fillAlpha ){
graphics.beginFill( material.fillColor, fillAlpha );
}
// Line color
if( lineAlpha ){
graphics.lineStyle( 0, material.lineColor, lineAlpha );
}else{
graphics.lineStyle();
}
// Draw triangle
graphics.moveTo( x0, y0 );
graphics.lineTo( x1, y1 );
graphics.lineTo( x2, y2 ); //画三角形
if( lineAlpha ){
graphics.lineTo( x0, y0 );
}
if( texture || fillAlpha ){
graphics.endFill();
}
return 1;
}
==============================================================
DisplayObjectContainer3D对象
==============================================================
所在包 :org.papervision3d.core.proto
所在文件:DisplayObjectContainer3D.as
基类 :EventDispatcher
构造方法:
public function DisplayObjectContainer3D():void
字段:
public var root :DisplayObjectContainer3D;
protected var _children :Dictionary;
protected var _childrenByName :Object;
属性:
public function get numChildren():int
public function get children():Object
实例方法:
public function addChild( child :DisplayObject3D, name:String=null ):DisplayObject3D
public function addChildren( parent :DisplayObject3D ):DisplayObjectContainer3D
public function removeChild( child:DisplayObject3D ):DisplayObject3D
public function getChildByName( name:String ):DisplayObject3D
public function removeChildByName( name:String ):DisplayObject3D
public function childrenList():String
==============================================================
DisplayObject3D对象
==============================================================
所在包 :org.papervision3d.objects
所在文件:DisplayObject3D.as
基类 :DisplayObjectContainer3D
构造方法:
public function DisplayObject3D( name:String=null, geometry:GeometryObject3D=null, initObject:Object=null ):void
字段:
public var visible :Boolean;
public var name :String;
public var id :int;
public var extra :Object
public var container :Sprite;
public var material :MaterialObject3D;
public var materials :MaterialsList;
public var scene :SceneObject3D;
public var parent :DisplayObjectContainer3D;
public static const MESH_SORT_CENTER:String = "meshSortCenter";
public static const MESH_SORT_FAR:String = "meshSortFar";
public static const MESH_SORT_CLOSE:String = "meshSortClose";
public var meshSort:String = MESH_SORT_CENTER;
public var transform :Matrix3D;
public var view :Matrix3D;
public var projected :Dictionary;
public var faces :Array = new Array();
public var geometry :GeometryObject3D;
public var screenZ :Number;
protected var _transformDirty :Boolean = false;
protected var _sorted :Array;
//属性
public static function get ZERO():DisplayObject3D
//实例方法
public function addGeometry( geometry:GeometryObject3D=null ):void
public function distanceTo( obj:DisplayObject3D ):Number
public function hitTestPoint( x:Number, y:Number, z:Number ):Boolean
public function hitTestObject( obj:DisplayObject3D, multiplier:Number=1 ):Boolean
public function getMaterialByName( name:String ):MaterialObject3D
public function materialsList():String
public function project( parent :DisplayObject3D, camera :CameraObject3D, sorted :Array=null ):Number
public function render( scene :SceneObject3D ):void
public function moveForward ( distance:Number ):void
public function moveBackward ( distance:Number ):void
public function moveLeft ( distance:Number ):void
public function moveRight ( distance:Number ):void
public function moveUp ( distance:Number ):void
public function moveDown ( distance:Number ):void
public function translate( distance:Number, axis:Number3D ):void
public function pitch( angle:Number ):void
public function yaw( angle:Number ):void
public function roll( angle:Number ):void
public function lookAt( targetObject:DisplayObject3D, upAxis:Number3D=null ):void
public function copyPosition( reference:* ):void
public function copyTransform( reference:* ):void
protected function updateTransform():void
==============================================================
SceneObject3D对象
==============================================================
所在包 :org.papervision3d.core.proto
所在文件:SceneObject3D.as
基类 :DisplayObjectContainer3D
构造方法:
public function SceneObject3D( container:Sprite )
字段:
public var container :Sprite;
public var stats :Object;
public var objects :Array;
public var materials :MaterialsList;
实例方法:
public function renderCamera( camera :CameraObject3D ):void
保护方法:
protected function renderObjects( sort:Boolean ):void {}
==============================================================
Scene3D对象
==============================================================
所在包 :org.papervision3d.scenes
所在文件:Scene3D.as
基类 :SceneObject3D
构造方法:
public function Scene3D( container:Sprite )
重写基类保护方法:
protected override function renderObjects( sort:Boolean ):void
==============================================================
FlexScene3D对象
==============================================================
所在包 :org.papervision3d.scenes
所在文件:FlexScene3D.as
基类 :Scene3D
构造方法:
public function FlexScene3D(container:Sprite)
实例方法:
public function getSprite(child:DisplayObject3D):Canvas
重写基类保护方法:
public override function addChild( child :DisplayObject3D, name :String=null ):DisplayObject3D
protected override function renderObjects( sort:Boolean ):void
==============================================================
MovieScene3D对象
==============================================================
所在包 :org.papervision3d.scenes
所在文件:MovieScene3D.as
基类 :Scene3D
构造方法:
public function MovieScene3D( container:Sprite )
实例方法:
public function getSprite(child:DisplayObject3D):Canvas
重写基类保护方法:
public override function addChild( child :DisplayObject3D, name :String=null ):DisplayObject3D
protected override function renderObjects( sort:Boolean ):void
==============================================================
Vertices3D对象
==============================================================
所在包 :org.papervision3d.core.geom
所在文件:Vertices3D.as
基类 :DisplayObject3D
构造方法:
public function Vertices3D( vertices:Array, name:String=null, initObject:Object=null )
实例方法:
public function boundingBox():Object
public function transformVertices( transformation:Matrix3D ):void
==============================================================
Mesh3D对象
==============================================================
所在包 :org.papervision3d.core.geom
所在文件:Mesh3D.as
基类 :Vertices3D
构造方法:
public function Mesh3D( material:MaterialObject3D, vertices:Array, faces:Array, name:String=null, initObject:Object=null )
实例方法:
public function projectTexture( u:String="x", v:String="y" ):void
==============================================================
CameraObject3D对象
==============================================================
所在包 :org.papervision3d.core.proto
所在文件:CameraObject3D.as
基类 :DisplayObject3D
构造方法:
public function CameraObject3D( zoom:Number=3, focus:Number=500, initObject:Object=null )
字段:
public var zoom :Number;
public var focus :Number;
public var sort :Boolean;
public static var DEFAULT_POS :Number3D = new Number3D( 0, 0, -1000 );
实例方法:
public function transformView( transform:Matrix3D=null ):void
public function tilt( angle:Number ):void
public function pan( angle:Number ):void
==============================================================
Camera3D对象
==============================================================
所在包 :org.papervision3d.cameras
所在文件:Geometry3D.as
基类 :CameraObject3D
构造方法:
public function Camera3D( target:DisplayObject3D=null, zoom:Number=2, focus:Number=100, initObject:Object=null )
字段:
public var target :DisplayObject3D;
public var goto :Number3D;
实例方法:
public function hover( type:Number, mouseX:Number, mouseY:Number ):void
重写基类方法:
public override function transformView( transform:Matrix3D=null ):void
==============================================================
FreeCamera3D对象
==============================================================
所在包 :org.papervision3d.cameras
所在文件:FreeCamera3D.as
基类 :CameraObject3D
构造方法:
public function FreeCamera3D( zoom:Number=2, focus:Number=100, initObject:Object=null )
重写基类方法:
public override function transformView( transform:Matrix3D=null ):void
==============================================================
GeometryObject3D对象
==============================================================
所在包 :org.papervision3d.core.proto
所在文件:GeometryObject3D.as
基类 :EventDispatcher
构造方法:
public function GeometryObject3D( initObject:Object=null ):void
字段:
public var materials :MaterialsList;
public var faces :Array;
public var vertices :Array;
public var ready :Boolean = false;
protected var _material :MaterialObject3D;
protected var _boundingSphere2 :Number;
protected var _boundingSphereDirty :Boolean = true;
属性:
public function get material():MaterialObject3D
public function set material( newMaterial:MaterialObject3D ):void
public function get boundingSphere2():Number
public function getBoundingSphere2():Number
实例方法:
public function transformVertices( transformation:Matrix3D ):void {}
public function transformUV( material:MaterialObject3D ):void
==============================================================
MaterialObject3D对象
==============================================================
所在包 :org.papervision3d.core.proto
所在文件:MaterialObject3D.as
基类 :EventDispatcher
构造方法:
public function MaterialObject3D( initObject:Object=null )
字段:
public var bitmap :BitmapData;
public var smooth :Boolean;
public var lineColor :Number;
public var lineAlpha :Number;
public var fillColor :Number;
public var fillAlpha :Number;
public var oneSide :Boolean;
public var invisible :Boolean;
public var opposite :Boolean;
public var scene :SceneObject3D;
public static var DEFAULT_COLOR :int = 0x000000;
public static var DEBUG_COLOR :int = 0xFF00FF;
public var name :String;
public var id :Number;
public var maxU :Number;
public var maxV :Number;
属性:
public function get doubleSided():Boolean
public function set doubleSided( double:Boolean ):void
public static function get DEFAULT():MaterialObject3D
public static function get DEBUG():MaterialObject3D
实例方法:
public function updateBitmap():void {}
public function copy( material :MaterialObject3D ):void
public function clone():MaterialObject3D
==============================================================
WireframeMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:WireframeMaterial.as
基类 :MaterialObject3D
构造方法:
public function WireframeMaterial( color:Number=0xFF00FF, alpha:Number=100, initObject:Object=null )
==============================================================
ColorMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:ColorMaterial.as
基类 :MaterialObject3D
构造方法:
public function ColorMaterial( color:Number=0xFF00FF, alpha:Number = 100, initObject:Object=null )
==============================================================
BitmapMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:BitmapMaterial.as
基类 :MaterialObject3D
构造方法:
public function BitmapMaterial( asset :*, initObject :Object=null )
字段:
public static var AUTO_MIP_MAPPING :Boolean = true;
public static var MIP_MAP_DEPTH :Number = 8;
protected var _texture :*;
属性:
public function get texture():*
public function set texture( asset:* ):void
公共方法:
public function correctBitmap( bitmap :BitmapData, dispose :Boolean ):BitmapData
保护方法:
protected function createBitmap( asset:* ):BitmapData
protected function extendBitmapEdges( bmp:BitmapData, originalWidth:Number, originalHeight:Number )
重写基类方法:
override public function copy( material :MaterialObject3D ):void
override public function clone():MaterialObject3D
==============================================================
BitmapFileMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:BitmapMaterial.as
基类 :BitmapMaterial
构造方法:
public function BitmapFileMaterial( url :String, initObject :Object=null )
字段:
public var url :String = "";
public var loaded :Boolean;
static public var callback :Function;
static public var LOADING_COLOR :int = MaterialObject3D.DEFAULT_COLOR;
重写基类保护方法:
protected override function createBitmap( asset:* ):BitmapData
==============================================================
BitmapAssetMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:BitmapAssetMaterial.as
基类 :BitmapMaterial
构造方法:
public function BitmapAssetMaterial( id:String, initObject:Object=null )
重写基类保护方法:
protected override function createBitmap( asset:* ):BitmapData
==============================================================
MovieMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:BMovieMaterial.as
基类 :BitmapMaterial
构造方法:
public function BitmapAssetMaterial( id:String, initObject:Object=null )
字段:
public var movie :MovieClip;
public var movieTransparent :Boolean;
属性:
public function get animated():Boolean
public function set animated( status:Boolean ):void
公共方法:
static public function updateAnimatedBitmaps():void
重写基类方法:
public override function updateBitmap():void
protected override function createBitmap( asset:* ):BitmapData
==============================================================
MovieAssetMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:MovieAssetMaterial.as
基类 :MovieMaterial
构造方法:
public function MovieAssetMaterial( id:*, transparent:Boolean=false, initObject:Object=null )
重写基类方法:
protected override function createBitmap( asset:* ):BitmapData
==============================================================
VideoStreamMaterial对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:VideoStreamMaterial.as
基类 :MovieMaterial
构造方法:
public function VideoStreamMaterial ( video:Video=null, stream:NetStream=null, initObject:Object=null )
字段:
public var stream:NetStream;
public var video:Video;
重写基类方法:
protected override function createBitmap( asset:* ):BitmapData
public override function updateBitmap ():void
==============================================================
MaterialsList对象
==============================================================
所在包 :org.papervision3d.materials
所在文件:MaterialsList.as
构造方法:
public function MaterialsList( materials :*=null ):void
字段:
public var materialsByName :Dictionary;
属性:
public function get numMaterials():int
实例方法:
public function addMaterial( material:MaterialObject3D, name:String=null ):MaterialObject3D
public function removeMaterial( material:MaterialObject3D ):MaterialObject3D
public function getMaterialByName( name:String ):MaterialObject3D
public function removeMaterialByName( name:String ):MaterialObject3D
public function clone():MaterialsList
==============================================================
FileLoadEvent对象
==============================================================
所在包 :org.papervision3d.events
所在文件:FileLoadEvent.as
基类 :Event
构造方法:
public function FileLoadEvent( type:String, p_file:String="", bubbles:Boolean=false, cancelable:Boolean=false )
字段:
public static var LOAD_COMPLETE :String = "loadComplete";
public static var LOAD_ERROR :String = "loadError";
public static var COLLADA_MATERIALS_DONE:String = "colladaMaterialsDone";
public var file:String;
三 PV3D Demo 代码
PV3D Demo 浏览地址:
http://www.yc330.net/site/flash/pv3d.swf
package application{
import flash.display.*;
import flash.events.*;
import flash.ui.Keyboard;
import flash.text.TextField;
import flash.utils.Timer;
import org.papervision3d.core.*;
import org.papervision3d.core.proto.*;
import org.papervision3d.core.geom.*;
import org.papervision3d.cameras.*;
import org.papervision3d.materials.*;
import org.papervision3d.objects.*;
import org.papervision3d.scenes.*;
public class Main extends Sprite {
/*字段*/
private var _container:Sprite; //2D容器
private var _3DRootNode:DisplayObject3D; //3D模型根节点,继承自DisplayObjectContainer3D
private var _scene:Scene3D; //3D场景
private var _camera:CameraObject3D; //3D摄像机对象,是其他摄像机的基类
private var _boxMaterial:MaterialObject3D; //3D材质对象,是其他材质的基类
private var _coneMaterial:MaterialObject3D; //3D材质对象,是其他材质的基类
private var _boxMesh:Mesh3D; //模型
private var _coneMesh:Mesh3D; //模型
private var _timer:Timer;
private var _isMouse:Boolean;
/*构造方法*/
public function Main() {
initialize();
registerEvent();
}
/*初始化*/
private function initialize():void {
_timer = new Timer(40);
_isMouse = false;
//初始化2D平面
_container = new Sprite();
_container.x = stage.stageWidth*0.5;
_container.y = stage.stageHeight*0.5;
//初始化3D模型根节点
_3DRootNode = new DisplayObject3D("_3DRootNode");
//初始化3D场景,场景中所有的3D模型最终通过各种坐标转换后都会渲染到2D平面,所以传入2D容器
_scene = new Scene3D(_container);
//初始化摄像机,这里是自由视角
_camera = new FreeCamera3D();
_camera.zoom = 6;
_camera.x = 0;
_camera.y = 0;
_camera.z = -999;
//初始化材质,这里是把导入到在flash库里的对象,其连接符号为my00001.jpg的对象传给材质加载
_boxMaterial = new BitmapAssetMaterial("my00001.jpg");
_boxMaterial.smooth = true;
_coneMaterial = new BitmapAssetMaterial("my00002.jpg");
_coneMaterial.smooth = true;
//初始化模型,这里是用PV3D内部定义的模型对象,即一个长方体
_boxMesh = new Cube(_boxMaterial,500,300,350,5,5,5);
_boxMesh.rotationX = 21;
_boxMesh.rotationY = 32;
_boxMesh.rotationZ = 44;
_boxMesh.x=-30;
_boxMesh.y=0;
_boxMesh.z=0;
//初始化模型
_coneMesh = new Cone(_coneMaterial,100,100,3,1);
_coneMesh.x = 350;
_coneMesh.y = -210;
_coneMesh.z = 1;
//把模型加入到3D根节点
_3DRootNode.addChild(_boxMesh);
_3DRootNode.addChild(_coneMesh);
//把3D根节点加入3D场景
_scene.addChild(_3DRootNode);
//把2D平面加入DisplayObject对象,这里就是Sprite本身
addChild(_container);
_timer.start();
}
/*注册事件*/
private function registerEvent():void {
//计时器
_timer.addEventListener(TimerEvent.TIMER, timerEventHandler);
_container.addEventListener(MouseEvent.MOUSE_OVER, boxMouseEventHandler);
_container.addEventListener(MouseEvent.MOUSE_OUT, boxMouseEventHandler);
//模型和摄像机控制
stage.addEventListener( KeyboardEvent.KEY_DOWN, keyboardEventHandler );
}
private function boxMouseEventHandler(event:MouseEvent):void{
if(event.type == MouseEvent.MOUSE_OVER){
_isMouse = true;
}else{
_isMouse = false;
}
}
/*计时器*/
private function timerEventHandler(event:TimerEvent):void{
render(event);
}
/*渲染摄像机范围的3D场景*/
private function render(event:TimerEvent):void {
if(_isMouse){
_boxMesh.rotationY += mouseY>>1>>5;
_boxMesh.rotationX += mouseX>>1>>5;
_boxMesh.rotationZ += mouseX>>1>>5;
}
_coneMesh.rotationY += 1;
_coneMesh.rotationX += 1;
_coneMesh.rotationZ += 1;
_scene.renderCamera(_camera);
}
/*对模型的控制*/
private function keyboardEventHandler(event:KeyboardEvent):void {
if(!_isMouse){
var moveLR:Number = 3;
var moveFB:Number = 3;
var rotateLeftRight:Number = 5;
var rotateUpDown:Number = 5;
var cameraZoom:Number = 10;
switch(event.keyCode) {
case Keyboard.UP:
_boxMesh.rotationX -= rotateUpDown;
break;
case Keyboard.DOWN:
_boxMesh.rotationX += rotateUpDown;
break;
case Keyboard.LEFT:
_boxMesh.rotationY += rotateLeftRight;
//_3DRootNode.rotationY += rotateLeftRight;
break;
case Keyboard.RIGHT:
_boxMesh.rotationY -= rotateLeftRight;
//_3DRootNode.rotationY -= rotateLeftRight;
break;
}
}
}
}
}
完。。。。。