我们一般在构建papervision3D构架的时候需要创建下面是个基本的框架元素:
视图viewport >>
场景scene >>
相机camera >>
渲染器renderer
private var viewport:Viewport3D;
private var scene:Scene3D;
private var camera:FreeCamera3D;
private var renderer:BasicRenderEngine;
从Viewport3D的定义
public class Viewport3D extends Sprite implements IViewport3D
我们可以看到Viewport3D是继承之Sprite,它具有了Sprite的所有属性和方法。
同时它实现(implements)了IViewport3D的接口方法。
现在papervision3D给我们提供了一个BasicView,它包含了我们需要的所有元素。
我们看看BasicView的构造函数
public class BasicView extends AbstractView implements IView
BasicView继承自AbstractView(抽象类视图,我们可以这么理解,但是AbstractView是继承自Sprite的)
public class AbstractView extends Sprite implements IView
BasicView(基本视图)和AbstractView(抽象类视图)都实现了统一的接口方法IView。
大家先看看BasicView的全部代码:
package org.papervision3d.view
{
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.core.proto.CameraObject3D;
import org.papervision3d.core.view.IView;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
/**
* @Author Ralph Hauwert
*/
public class AbstractView extends Sprite implements IView
{
protected var _camera:CameraObject3D;
protected var _height:Number;
protected var _width:Number;
public var scene:Scene3D;
public var viewport:Viewport3D;
public var renderer:BasicRenderEngine;
public function AbstractView()
{
super();
}
public function startRendering():void
{
addEventListener(Event.ENTER_FRAME, onRenderTick);
viewport.containerSprite.cacheAsBitmap = false;
}
public function stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void
{
removeEventListener(Event.ENTER_FRAME, onRenderTick);
if(reRender){
onRenderTick();
}
if(cacheAsBitmap){
viewport.containerSprite.cacheAsBitmap = true;
}else{
viewport.containerSprite.cacheAsBitmap = false;
}
}
public function singleRender():void
{
onRenderTick();
}
protected function onRenderTick(event:Event = null):void
{
renderer.renderScene(scene, _camera, viewport);
}
public function get camera():CameraObject3D
{
return _camera;
}
public function set viewportWidth(width:Number):void
{
_width = width;
viewport.width = width;
}
public function get viewportWidth():Number
{
return _width;
}
public function set viewportHeight(height:Number):void
{
_height = height;
viewport.height = height;
}
public function get viewportHeight():Number
{
return _height;
}
}
}
它内含了
protected var _camera:CameraObject3D; //(保护属性)相机
protected var _height:Number; //(保护属性)画布的宽
protected var _width:Number; // (保护属性) 画布的高
public var scene:Scene3D; // (公开属性) 三维场景
public var viewport:Viewport3D; // (公开属性) 三维视图
public var renderer:BasicRenderEngine; // (公开属性) 渲染器
继续分析:
//继承Sprite的构造方法
public function AbstractView()
{
super();
}
下面的三个函数:
function singleRender():void;
function startRendering():void;
function stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void;
}
实现了IView接口函数
见IView接口类代码如下:
package org.papervision3d.core.view
{
/**
* @Author Ralph Hauwert
*/
public interface IView
{
function singleRender():void;
function startRendering():void;
function stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void;
}
}
BasicView的构造函数:
public function BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
分析一下参数:
BasicView(视图的长-默认640,视图的宽-默认480,是否随着舞台缩放,场景是否可以交互,摄像机的类型-默认类型是Target类型)
pv3d的在线帮助文件中描述如下:
Parameters viewportWidth:Number (default = 640) — Width of the viewport
viewportHeight:Number (default = 480) — Height of the viewport
scaleToStage:Boolean (default = true) — Whether you viewport should scale with the stage
interactive:Boolean (default = false) — Whether your scene should be interactive
cameraType:String (default = "Target") — A String for the type of camera.
最终这些参数会在生成viewport3D对象的时候直接作为它的参数传给viewport3D的构造函数了。
viewport = new Viewport3D(viewportWidth, viewportHeight, scaleToStage, interactive);