Papervision3D(PV3D)笔记&教程(1)-四个基础元素

要使用PV3D,其中有四个元素少不了,Scene3D, Viewport3D, Camera3D , BasicRenderEngine,以下是官方文档的介绍和本人拙劣的翻译。 
  Scene3D:
Package org.papervision3d.scenes
Class public class Scene3D
Inheritance Scene3D SceneObject3D DisplayObjectContainer3D flash.events.EventDispatcher
  The Scene3D class lets you create a scene where all objects are rendered in the same container.
A scene is the place where objects are placed, it contains the 3D environment.
  一个Scene3D实例是这个3D场景中所有物体的容器,它包括了整个3D场景,Scene3D这个类让所有创建在其中的3D物体得到渲染。  
  简单的说,Scene3D就是包含所有3D场景中物体的容器,物体要显示,该物体或它的父类首先要加入到Scene3D的实例中。注意,虽然要显示的物体都要加入到Scene3D的实例中,但它并不是一个显示对象,也就是说它并不直接显示物体.而真正显示物体的是Viewport3D,接着看下一个:

     Viewport3D:
Package org.papervision3d.view
Class public class Viewport3D
Inheritance Viewport3D flash.display.Sprite
Implements IViewport3D
Subclasses BitmapViewport3D
 
  Viewport3D,viewport是视口的意思,我们可以理解为显示物体的一个窗口或矩形显示区域,它继承自Sprite,所以说它可以直接被加入到显示列表中,我们PV3D中所看到的物体就是通过Viewport3D呈现的。同时它还实现了IViewport3D接口。
 
构造函数
Viewport3D (viewportWidth:Number = 640, viewportHeight:Number = 480, autoScaleToStage:Boolean = false, interactive:Boolean = false, autoClipping:Boolean = true, autoCulling:Boolean = true)
 
viewportWidth:Number (default = 640) — Width of the viewport
视口宽度
 
viewportHeight:Number (default = 480) — Height of the viewport
视口高度
 
autoScaleToStage:Boolean (default = false) — Determines whether the viewport should resize when the stage resizes
是否随舞台大小改变而调整视口大小
 
interactive:Boolean (default = false) — Determines whether the viewport should listen for Mouse events by creating an InteractiveSceneManager
是否接受交互,需要接受交互事件时需将其设为true
 
autoClipping:Boolean (default = true) — Determines whether DisplayObject3Ds outside the rectangle of the viewport should be rendered
是否不渲染视口外的物体,true不渲染,false渲染,没特殊要求默认设为true,提高效率
 
autoCulling:Boolean (default = true) — Detemines whether only the objects in front of the camera should be rendered. In other words, if a triangle is hidden by another triangle from the camera, it will not be rendered.
被遮挡的物体是否不渲染,true不渲染,false渲染,没特殊要求默认设为true,提高效率
 
 
再然后是Camera3D:
  Camera3D
Package org.papervision3d.cameras
Class public class Camera3D
Inheritance Camera3D CameraObject3D DisplayObject3D DisplayObjectContainer3D flash.events.EventDispatcher
Subclasses DebugCamera3D, SpringCamera3D
 
  Camera3D is the basic camera used by Papervision3D
  Camera3D是PV3D中基本的摄像机。
  
  我们可以把它理解为一个3D空间中的摄像机的镜头,我们在Viewport3D中所看到的东西就是这个镜头中所拍到的,当然我们就可以通过改变这个镜头的位置,角度,焦距等属性,来显示不同的场景或做镜头移动的动画。
 
构造函数
Camera3D(fov:Number = 60, near:Number = 10, far:Number = 5000, useCulling:Boolean = false, useProjection:Boolean = false)
 
fov:Number (default = 60) — This value is the vertical Field Of View (FOV) in degrees.
镜头视角的垂直角度
 
  
  最后来看BasicRenderEngine:
  BasicRenderEngine:
Package org.papervision3d.render

Class public class BasicRenderEngine
Inheritance BasicRenderEngine AbstractRenderEngine flash.events.EventDispatcher
Implements IRenderEngine
Subclasses LazyRenderEngine, QuadrantRenderEngine
  
  BasicRenderEngine links Viewport3Ds, Scene3D, and Camera3Ds together by gathering in all of their data, rendering the data, then calling the necessary functions to update from the rendered data
  BasicRenderEngine翻译为基础渲染引擎,它有将Viewport3Ds, Scene3D 和 Camera3Ds整合在一起协同工作的功能,形象的说,就是它通过镜头的位置角度等属性,读取Scene3D中需要渲染的物体的信息,通过计算(即渲染)后得到得数据提交给Viewport3D呈现出来。
 
  这里我们先学习它的一个最常用的方法
renderScene(scene:SceneObject3D, camera:CameraObject3D, viewPort:Viewport3D):RenderStatistics
  
scene:SceneObject3D — The CameraObject3D looking at the scene
需要渲染的场景
 
camera:CameraObject3D — The Scene3D holding the DisplayObject3D’s you want rendered
镜头
 
viewPort:Viewport3D — The Viewport3D that will display your scene
呈现渲染结果的视口(显示区域)
 
RenderStatistics — RenderStatistics The RenderStatistics objectholds all the data from the last render
渲染返回结果
 
注意下Viewport3D和BasicRenderEngine的destroy()方法,内存没被回收的根源也许就在这里
   
  介绍完了这些,我们先来看一段代码
  首先我们在setupPV3D()中初始化了四个基本元素,接着在setupShere()中向scene添加了一个球体,最后用addEventListener(Event.ENTER_FRAME, onRenderLoop)添加一个逐帧的监听,在侦听器中每帧将球体的rotationY增加2以达到旋转的效果并且每帧进行渲染_renderer.renderScene(_scene, _camera, _viewport)。

package cn.antscript.HelloWorld
{
	import flash.display.Sprite;
	import flash.events.Event;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.materials.WireframeMaterial;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
 
 
	 [SWF(width = "640", height = "480", backgroundColor = "#000000", frameRate = "30")]
 
	public class Main extends Sprite 
	{
		private var _scene:Scene3D;
		private var _viewport:Viewport3D;
		private var _camera:Camera3D;
		private var _renderer:BasicRenderEngine;
 
		private var _sphere:Sphere;
 
		public function Main():void 
		{
			init();
		}
 
		private function init(e:Event = null):void 
		{
			setupPV3D();
			setupShere();
			addEventListener(Event.ENTER_FRAME, onRenderLoop);
		}
 
 
 
		//setup PV3D method
		private function setupPV3D():void
		{
 
			_scene = new Scene3D();
 
			_viewport = new Viewport3D();
			addChild(_viewport);
 
			_camera = new Camera3D();
 
			_renderer = new BasicRenderEngine();
		}
 
		//setup shere 
		private function setupShere():void
		{
			_sphere = new Sphere(new WireframeMaterial());
			_scene.addChild(_sphere);
		}
 
		//renderer every frame 
		private function onRenderLoop(e:Event):void 
		{
			_sphere.rotationY += 2;
			_renderer.renderScene(_scene, _camera, _viewport);
		}
 
	}
 
}

 效果

 

看完了上面的代码,试着动手创造一个自己的3D世界吧,再看一下文档(官方在线的点这里),试着修改下各种参数试试效果,举一反三,有助于你更牢固的掌握相关知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值