现在的位置: 首页 > 综合 > 正文

PV3D类继承体系结构及其内部结构惯用手法,附DEMO文件!

2012年06月28日 ⁄ 综合 ⁄ 共 33391字 ⁄ 字号 评论关闭

如大家要转载,请保留本人的版权:
/*
*Description:PV3D类继承体系结构

*Auther:崇崇-天真的好蓝啊
*MSN:chongchong2008@msn.com
*Blog:chongchong2008
*Dates:2009-06-02
*Copyright:ChongChong2008 YiChang HuBei China
*/

 

 

 

对AS3感兴趣的朋友,可以看我的上一篇基础文章"ActionScript开发注意事项! ",下面的内容是关于PV3D的。

pv 3D Demo在这里浏览:

PV3D Demo OnLine

 [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;
                 }
             }
        }

     }
}

 

完。。。。。

 

 

 

 

抱歉!评论已关闭.