- 浏览: 148130 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
wenti:
哪里能看到图片啊,我按照你的方式放在一个包里,怎么不能启动啊
将flex air 打包成绿色版exe -
jE初学者:
不知道大侠是怎么解决出现DOS窗口这个问题的,您能写清楚一点吗 ...
将flex air 打包成绿色版exe -
zfms:
好像没管用呢?
java项目部署到tomcat服务器如何去掉工程名web服务器有关 -
makosun:
没有下载链接啊!
windows 2003 序列号
Papervision3D学习基础教程
要使用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 BasicRenderEngineInheritance BasicRenderEngine AbstractRenderEngine flash.events.EventDispatcherImplements IRenderEngineSubclasses 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); } } }//end
这篇我们来看一下BasicView这个类,它可以让我们非常方便的创造出一个包含前面所说的那四个基本元素的3D世界。你只需要实例化它并加入到显示列表中即可,但我们更常用的是通过继承它来直接使用这个3D世界,现在先看一下它的文档。
BasicView
Package org.papervision3d.view
Class public class BasicView
Inheritance BasicView AbstractView flash.display.Sprite
Implements IView
Subclasses ReflectionView
BasicView provides a simple template for quickly setting up basic Papervision3D projects by creating a viewport, scene, camera, and renderer for you. Because BasicView is a subclass of Sprite, it can be added to any DisplayObject.
BasicView为我们提供了一个包含viewport, scene, camera, 和renderer,可以 快速创建PV3D项目的模版,而且它是Sprite的子类,可以直接添加到任何DO里面。
构造方法
BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = “Target”)
参数应该能理解吧,不理解的看看前面那篇笔记。
然后看几个它继承自AbstractView的比较有用的属性和方法
camera : CameraObject3D
renderer : BasicRenderEngine
scene : Scene3D
viewport : Viewport3D
viewportHeight : Number
viewportWidth : Number
这些属性不清楚的看下前面的笔记
方法:
singleRender():void
渲染一次
startRendering():void
开始每帧渲染
stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void
结束每帧渲染
了解了这些属性和方法,我们来看一段代码,这段代码实现了和前面教程完全一样的效果。
------------------------------------------------------------------------------------------------------------------------------------------
package { import flash.events.Event; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640",height="480",backgroundColor="#000000",frameRate="30")] public class BasicViewExample extends BasicView { private var _sphere:Sphere; public function BasicViewExample() { super(); init(); } private function init():void { setupSphere(); startRendering(); } private function setupSphere():void { _sphere=new Sphere(new WireframeMaterial ); scene.addChild(_sphere); } override protected function onRenderTick(event:Event=null):void { _sphere.rotationY+=2; renderer.renderScene(scene,camera,viewport); } } }--------------------------------------------------------------------------------------------------
记得上中学的时候学立体几何,老师提到过左手坐标系右手坐标系什么的,不过现在已经基本忘记了,从头再来吧。
首先运行一段代码看看,这段代码的作用是创建颜色分别为红绿蓝的三条线,起点都为坐标原点,终点分别指向XYZ轴的正方向,我们需要用到Line3D,Lines3D,LineMeterial以及Vertex3D这四个类,这四个类会在后面详细介绍,这里只要知道作用是什么就可以了。
Lines3D可以看作是Line3D的一个容器,Line3D本身不能作为3D显示对象被直接加入到Scene3D中,只能通过Lines3D的addLine(line:Line3D)方法先加入到Lines3D以后,再把Lines3D加入到Scene3D里呈现,Lines3D还有一个方法就是addNewLine(size:Number, x0:Number, y0:Number, z0:Number, x1:Number, y1:Number, z1:Number)这个方法允许Lines3D直接绘制出线段,如果初始化时候没有给Lines3D材质的话默认是红色的线,而且一个Lines3D用addNewLine方法绘制的线条只能有一种颜色,所以我们这里需要重新加入3条不同颜色的Line3D。
-----------------------------------------------------------------------------------------------------------------------------------------
package {
import flash.events.Event;
import org.papervision3d.core.geom.Lines3D;
import org.papervision3d.core.geom.renderables.Line3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.view.BasicView;
[SWF(width="640",height="480",backgroundColor="#000000",frameRate="30")]
public class CoordinateSystem extends BasicView {
private var _lines:Lines3D;
private var _xAxis:Line3D;
private var _yAxis:Line3D;
private var _zAxis:Line3D;
public function CoordinateSystem() {
init();
}
private function init():void {
setupCoordinateSystem();
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function setupCoordinateSystem():void {
_lines=new Lines3D ;
scene.addChild(_lines);
var origin:Vertex3D=new Vertex3D ;
_xAxis=new Line3D(_lines,new LineMaterial(0xff0000),1,origin,new Vertex3D(200,0,0));
_lines.addLine(_xAxis);
_yAxis=new Line3D(_lines,new LineMaterial(0x00ff00),1,origin,new Vertex3D(0,200,0));
_lines.addLine(_yAxis);
_zAxis=new Line3D(_lines,new LineMaterial(0x0000ff),1,origin,new Vertex3D(0,0,200));
_lines.addLine(_zAxis);
}
private function onEnterFrame(event:Event=null):void {
_lines.rotationY+=1;
_lines.rotationX+=1;
singleRender();
if (Math.round(_lines.rotationX%360)==0&&Math.round(_lines.rotationY%360)==0) {
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
trace("stoped!");
}
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------
DisplayObject3D相当于FLASH中的DisplayObject,任何在屏幕上被渲染出来的3D物体都是它的子类,它的子类有以下这些:CameraObject3D, Collada, DAE, LightObject3D, Max3DS, Mouse3D, SimpleLevelOfDetail, Sketchup, SketchupCollada, Sound3D, Vertices3D,它们根据各自的实现或功能的不同分成了不同的类或者派生出不同的子类,这些以后再细看。
现在我们只要知道DisplayObject3D的一些常用属性和方法,不清楚的查下文档自己试验一下。
scaleX
scaleY
scaleZ
scale 有这个就方便多了^_^
rotationX
rotationY
rotationZ
pitch() 对应rotationX
yaw() 对应rotationY
roll() 对应rotationZ
moveForward() z正方向移动
moveBackward() z反方向移动
moveRight() x正方向移动
moveLeft() x反方向移动
moveUp() y正方向移动
moveDown() y反方向移动
上面这些都是做运动时比较常用的,牢牢记住吧。
我们注意一下有个root的属性,有时可能会用到,如果在scene里的话root就是scene,否则为null。
另外看几个暂时不用但以后会很有用的:
transform : Matrix3D
被用于该显示对象的3D变换矩阵
translate(distance:Number, axis:Number3D):void
沿给定的矢量方向(axis:Number3D)移动给定的距离(distance:Number);
这里的Number3D所表示的只是一个方向,它的模的大小和移动的距离无关
transformVertices (transformation:Matrix3D) : void
试验的时候发现这个文档里面没有的方法,测试了一下,和transform的作用差不多,只是这个是累加的。
还是看下文档先:
Line3D:Package org.papervision3d.core.geom.renderables
Class public class Line3D
Inheritance Line3D AbstractRenderable
Implements IRenderable
Line3D is used by Lines3D to store and render the lines.
Line3D被用来在Lines3D中创建出可以被渲染的线条
构造函数
Line3D(instance:Lines3D, material:LineMaterial, size:Number, vertex0:Vertex3D, vertex1:Vertex3D)
instance:Lines3D — The containing Lines3D object
要加入到的Lines3D实例
material:LineMaterial — The material for the line
材质
size:Number — The line weight
粗细
vertex0:Vertex3D — The start vertex
起点
vertex1:Vertex3D — The end vertex
终点
再看下它常用的属性和方法:
cV : Vertex3D 控制点
material : LineMaterial 材质
size : Number 粗细
v0 : Vertex3D 起点
v1 : Vertex3D 终点
addControlVertex(cx:Number, cy:Number, cz:Number):void
给线条添加一个控制点,感觉好像就是贝塞尔曲线里面那种控制点
Lines3D:Package org.papervision3d.core.geom
Class public class Lines3D
Inheritance Lines3D Vertices3D DisplayObject3D DisplayObjectContainer3D flash.events.EventDispatcher
Subclasses UCS
Lines3D是继承了DisplayObject3D,所以可以直接添加到scene或者其他3D显示对象容器中渲染显示。我们可以把Line3D的实例添加到Lines3D中(使用addLine()方法),也可以直接在Lines3D中画线(使用addNewLine()方法),前一种方法可以添加许多颜色不同的线,而后一种方法只可以画预先定义好材质的线
构造函数
Lines3D(material:LineMaterial = null, name:String = null)
material:LineMaterial (default = null)
使用addNewLine()方法添加进来的线条材质
name:String (default = null)
名字
属性
lines:Array Lines3D中所有线条的数组
方法
addLine(line:Line3D):void
添加一条线
addNewLine(size:Number, x0:Number, y0:Number, z0:Number, x1:Number, y1:Number, z1:Number):Line3D
添加一条线,使用Lines3D中定义的材质,默认为纯红色0xff0000
removeAllLines():void
删除里面的所有线条
removeLine(line:Line3D):void
删除线条
下面我们来看一段代码.
首先我们用addLine()方法画圆,画完以后使用removeAllLines()方法删除刚才画的圆,然后又画了一条线,添加了一个控制点,同时开始用addNewLine()开始重新画圆。
运行代码看效果,然后自己动手做一些练习吧!
----------------------------------------------------------------------------------------------------------------------------------------
package
{
import flash.events.Event;
import org.papervision3d.core.geom.Lines3D;
import org.papervision3d.core.geom.renderables.Line3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.view.BasicView;
public class DrawCircle extends BasicView
{
private static var _segment:int=500;
private static var _radius:Number=400;
private static var _offset:int=0;
private static var _beginVertex:Vertex3D;
private static var _endVertex:Vertex3D;
private static var _lineMaterial:LineMaterial;
private var _lines:Lines3D;
public function DrawCircle()
{
init();
}
private function init():void
{
createLines();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function createLines():void
{
_lines = new Lines3D();
_lines.addNewLine(10, 0, _radius, 0, 0, -_radius, 0);
scene.addChild(_lines);
_lineMaterial = new LineMaterial(Math.random() * 0xffffff);
_beginVertex = new Vertex3D(Math.sin(2*Math.PI*_offset/_segment)*_radius, Math.cos(2*Math.PI*_offset/_segment)*_radius, 0);
}
private function drawCircle():void {
_offset += 1;
_endVertex=new Vertex3D(Math.sin(2*Math.PI*_offset/_segment)*_radius, Math.cos(2*Math.PI*_offset/_segment)*_radius, 0);
_lines.addLine(new Line3D(_lines, _lineMaterial, 10, _beginVertex, _endVertex));
_beginVertex = _endVertex;
}
private function onEnterFrame(e:Event):void
{
if (_offset < _segment) {
drawCircle();
}else {
_lines.pitch(1);
}
singleRender();
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------
PV3D中材质的种类非常多,都是MaterialObject3D的子类,每个显示对象都需要材质才能显示。我们先来大致看一下所有的材质类:
MaterialObject3D
————LineMaterial
————ParticleMaterial
————————BitmapParticleMaterial
————————MovieAssetParticleMaterial
————TriangleMaterial
————————AbstractLightShadeMaterial
————————————AbstractSmoothShadeMaterial
————————————————EnvMapMaterial
————————————————————CellMaterial
————————————————————PhongMaterial
————————————————GouraudMaterial
————————————FlatShadeMaterial
————————BitmapMaterial
————————————BitmapAssetMaterial
————————————BitmapColorMaterial
————————————BitmapFileMaterial
————————————BitmapViewportMaterial
————————————MovieMaterial
————————————————MovieAssetMaterial
————————————————VideoStreamMaterial
————————BitmapWireframeMaterial
————————ColorMaterial
————————CompositeMaterial
————————ShadedMaterial
————————WireframeMaterial
————VectorShapeMaterial
————————Letter3DMaterial
上面列出了PV3D中所有的材质,大家可以先看一下,有个印象,以后用到的话方便查文档。下面看一下比较常用的几个。
ColorMaterial
ColorMaterial是最常用的一个材质,它只有单纯的颜色和透明度,看下构造函数
ColorMaterial (color:Number = 0xFF00FF, alpha:Number = 1, interactive:Boolean = false)
主要说下interactive这个参数,如果你需要你的三维物体接收交互(例如鼠标点击)的话要将它设为true,还有就是经常问到的一个问题,怎么实现鼠标手型,首先要将viewport的interactive设为true,然后将材质的interactive也设为true以后,在显示对象上监听InteractiveScene3DEvent.OBJECT_OVER事件,监听器中将viewport的buttonMode设为true(前面说过viewport是Sprite的子类,所以可以设置buttonMode),鼠标离开事件里再设为false就可以了,关于交互以后会专门学习下给大家分享。
照例上代码:
---------------------------------------------------------------------------------------------------------------------------------------
package
{
import gs.TweenLite;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
public class InteractivePlane extends BasicView
{
private var _plane:Plane
private var _material:ColorMaterial;
public function InteractivePlane()
{
super();
init()
}
private function init():void
{
initPanel();
startRendering();
}
private function initPanel():void
{
_material = new ColorMaterial(0x1D9DAD, 1, true);
_material.interactive = true;
_plane = new Plane(_material,500,500);
_plane.rotationX = 45;
scene.addChild(_plane);
viewport.interactive = true;
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onOver);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onOut);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
}
private function onClick(e:InteractiveScene3DEvent):void
{
_material.fillColor = Math.random() * 0xffffff;
}
private function onOver(e:InteractiveScene3DEvent):void
{
viewport.buttonMode = true;
TweenLite.to(_plane, 1, { rotationX:0 } );
}
private function onOut(e:InteractiveScene3DEvent):void
{
viewport.buttonMode = false;
TweenLite.to(_plane, 1, { rotationX:45 } );
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------
代码中创建了一个平面,然后给它了一个ColorMaterial的材质,然后监听鼠标的OVER,OUT,CLICK事件,当鼠标移上去的时候平面转动一定角度并出现手型,移开的话转动复原手型消失,当点击的时候给ColorMaterial的fillColor属性重新赋值改变平面颜色。
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 BasicRenderEngineInheritance BasicRenderEngine AbstractRenderEngine flash.events.EventDispatcherImplements IRenderEngineSubclasses 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); } } }//end
这篇我们来看一下BasicView这个类,它可以让我们非常方便的创造出一个包含前面所说的那四个基本元素的3D世界。你只需要实例化它并加入到显示列表中即可,但我们更常用的是通过继承它来直接使用这个3D世界,现在先看一下它的文档。
BasicView
Package org.papervision3d.view
Class public class BasicView
Inheritance BasicView AbstractView flash.display.Sprite
Implements IView
Subclasses ReflectionView
BasicView provides a simple template for quickly setting up basic Papervision3D projects by creating a viewport, scene, camera, and renderer for you. Because BasicView is a subclass of Sprite, it can be added to any DisplayObject.
BasicView为我们提供了一个包含viewport, scene, camera, 和renderer,可以 快速创建PV3D项目的模版,而且它是Sprite的子类,可以直接添加到任何DO里面。
构造方法
BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = “Target”)
参数应该能理解吧,不理解的看看前面那篇笔记。
然后看几个它继承自AbstractView的比较有用的属性和方法
camera : CameraObject3D
renderer : BasicRenderEngine
scene : Scene3D
viewport : Viewport3D
viewportHeight : Number
viewportWidth : Number
这些属性不清楚的看下前面的笔记
方法:
singleRender():void
渲染一次
startRendering():void
开始每帧渲染
stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void
结束每帧渲染
了解了这些属性和方法,我们来看一段代码,这段代码实现了和前面教程完全一样的效果。
------------------------------------------------------------------------------------------------------------------------------------------
package { import flash.events.Event; import org.papervision3d.materials.WireframeMaterial; import org.papervision3d.objects.primitives.Sphere; import org.papervision3d.view.BasicView; [SWF(width="640",height="480",backgroundColor="#000000",frameRate="30")] public class BasicViewExample extends BasicView { private var _sphere:Sphere; public function BasicViewExample() { super(); init(); } private function init():void { setupSphere(); startRendering(); } private function setupSphere():void { _sphere=new Sphere(new WireframeMaterial ); scene.addChild(_sphere); } override protected function onRenderTick(event:Event=null):void { _sphere.rotationY+=2; renderer.renderScene(scene,camera,viewport); } } }--------------------------------------------------------------------------------------------------
记得上中学的时候学立体几何,老师提到过左手坐标系右手坐标系什么的,不过现在已经基本忘记了,从头再来吧。
首先运行一段代码看看,这段代码的作用是创建颜色分别为红绿蓝的三条线,起点都为坐标原点,终点分别指向XYZ轴的正方向,我们需要用到Line3D,Lines3D,LineMeterial以及Vertex3D这四个类,这四个类会在后面详细介绍,这里只要知道作用是什么就可以了。
Lines3D可以看作是Line3D的一个容器,Line3D本身不能作为3D显示对象被直接加入到Scene3D中,只能通过Lines3D的addLine(line:Line3D)方法先加入到Lines3D以后,再把Lines3D加入到Scene3D里呈现,Lines3D还有一个方法就是addNewLine(size:Number, x0:Number, y0:Number, z0:Number, x1:Number, y1:Number, z1:Number)这个方法允许Lines3D直接绘制出线段,如果初始化时候没有给Lines3D材质的话默认是红色的线,而且一个Lines3D用addNewLine方法绘制的线条只能有一种颜色,所以我们这里需要重新加入3条不同颜色的Line3D。
-----------------------------------------------------------------------------------------------------------------------------------------
package {
import flash.events.Event;
import org.papervision3d.core.geom.Lines3D;
import org.papervision3d.core.geom.renderables.Line3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.view.BasicView;
[SWF(width="640",height="480",backgroundColor="#000000",frameRate="30")]
public class CoordinateSystem extends BasicView {
private var _lines:Lines3D;
private var _xAxis:Line3D;
private var _yAxis:Line3D;
private var _zAxis:Line3D;
public function CoordinateSystem() {
init();
}
private function init():void {
setupCoordinateSystem();
addEventListener(Event.ENTER_FRAME,onEnterFrame);
}
private function setupCoordinateSystem():void {
_lines=new Lines3D ;
scene.addChild(_lines);
var origin:Vertex3D=new Vertex3D ;
_xAxis=new Line3D(_lines,new LineMaterial(0xff0000),1,origin,new Vertex3D(200,0,0));
_lines.addLine(_xAxis);
_yAxis=new Line3D(_lines,new LineMaterial(0x00ff00),1,origin,new Vertex3D(0,200,0));
_lines.addLine(_yAxis);
_zAxis=new Line3D(_lines,new LineMaterial(0x0000ff),1,origin,new Vertex3D(0,0,200));
_lines.addLine(_zAxis);
}
private function onEnterFrame(event:Event=null):void {
_lines.rotationY+=1;
_lines.rotationX+=1;
singleRender();
if (Math.round(_lines.rotationX%360)==0&&Math.round(_lines.rotationY%360)==0) {
removeEventListener(Event.ENTER_FRAME,onEnterFrame);
trace("stoped!");
}
}
}
}
-------------------------------------------------------------------------------------------------------------------------------------------
DisplayObject3D相当于FLASH中的DisplayObject,任何在屏幕上被渲染出来的3D物体都是它的子类,它的子类有以下这些:CameraObject3D, Collada, DAE, LightObject3D, Max3DS, Mouse3D, SimpleLevelOfDetail, Sketchup, SketchupCollada, Sound3D, Vertices3D,它们根据各自的实现或功能的不同分成了不同的类或者派生出不同的子类,这些以后再细看。
现在我们只要知道DisplayObject3D的一些常用属性和方法,不清楚的查下文档自己试验一下。
scaleX
scaleY
scaleZ
scale 有这个就方便多了^_^
rotationX
rotationY
rotationZ
pitch() 对应rotationX
yaw() 对应rotationY
roll() 对应rotationZ
moveForward() z正方向移动
moveBackward() z反方向移动
moveRight() x正方向移动
moveLeft() x反方向移动
moveUp() y正方向移动
moveDown() y反方向移动
上面这些都是做运动时比较常用的,牢牢记住吧。
我们注意一下有个root的属性,有时可能会用到,如果在scene里的话root就是scene,否则为null。
另外看几个暂时不用但以后会很有用的:
transform : Matrix3D
被用于该显示对象的3D变换矩阵
translate(distance:Number, axis:Number3D):void
沿给定的矢量方向(axis:Number3D)移动给定的距离(distance:Number);
这里的Number3D所表示的只是一个方向,它的模的大小和移动的距离无关
transformVertices (transformation:Matrix3D) : void
试验的时候发现这个文档里面没有的方法,测试了一下,和transform的作用差不多,只是这个是累加的。
还是看下文档先:
Line3D:Package org.papervision3d.core.geom.renderables
Class public class Line3D
Inheritance Line3D AbstractRenderable
Implements IRenderable
Line3D is used by Lines3D to store and render the lines.
Line3D被用来在Lines3D中创建出可以被渲染的线条
构造函数
Line3D(instance:Lines3D, material:LineMaterial, size:Number, vertex0:Vertex3D, vertex1:Vertex3D)
instance:Lines3D — The containing Lines3D object
要加入到的Lines3D实例
material:LineMaterial — The material for the line
材质
size:Number — The line weight
粗细
vertex0:Vertex3D — The start vertex
起点
vertex1:Vertex3D — The end vertex
终点
再看下它常用的属性和方法:
cV : Vertex3D 控制点
material : LineMaterial 材质
size : Number 粗细
v0 : Vertex3D 起点
v1 : Vertex3D 终点
addControlVertex(cx:Number, cy:Number, cz:Number):void
给线条添加一个控制点,感觉好像就是贝塞尔曲线里面那种控制点
Lines3D:Package org.papervision3d.core.geom
Class public class Lines3D
Inheritance Lines3D Vertices3D DisplayObject3D DisplayObjectContainer3D flash.events.EventDispatcher
Subclasses UCS
Lines3D是继承了DisplayObject3D,所以可以直接添加到scene或者其他3D显示对象容器中渲染显示。我们可以把Line3D的实例添加到Lines3D中(使用addLine()方法),也可以直接在Lines3D中画线(使用addNewLine()方法),前一种方法可以添加许多颜色不同的线,而后一种方法只可以画预先定义好材质的线
构造函数
Lines3D(material:LineMaterial = null, name:String = null)
material:LineMaterial (default = null)
使用addNewLine()方法添加进来的线条材质
name:String (default = null)
名字
属性
lines:Array Lines3D中所有线条的数组
方法
addLine(line:Line3D):void
添加一条线
addNewLine(size:Number, x0:Number, y0:Number, z0:Number, x1:Number, y1:Number, z1:Number):Line3D
添加一条线,使用Lines3D中定义的材质,默认为纯红色0xff0000
removeAllLines():void
删除里面的所有线条
removeLine(line:Line3D):void
删除线条
下面我们来看一段代码.
首先我们用addLine()方法画圆,画完以后使用removeAllLines()方法删除刚才画的圆,然后又画了一条线,添加了一个控制点,同时开始用addNewLine()开始重新画圆。
运行代码看效果,然后自己动手做一些练习吧!
----------------------------------------------------------------------------------------------------------------------------------------
package
{
import flash.events.Event;
import org.papervision3d.core.geom.Lines3D;
import org.papervision3d.core.geom.renderables.Line3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.materials.special.LineMaterial;
import org.papervision3d.view.BasicView;
public class DrawCircle extends BasicView
{
private static var _segment:int=500;
private static var _radius:Number=400;
private static var _offset:int=0;
private static var _beginVertex:Vertex3D;
private static var _endVertex:Vertex3D;
private static var _lineMaterial:LineMaterial;
private var _lines:Lines3D;
public function DrawCircle()
{
init();
}
private function init():void
{
createLines();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function createLines():void
{
_lines = new Lines3D();
_lines.addNewLine(10, 0, _radius, 0, 0, -_radius, 0);
scene.addChild(_lines);
_lineMaterial = new LineMaterial(Math.random() * 0xffffff);
_beginVertex = new Vertex3D(Math.sin(2*Math.PI*_offset/_segment)*_radius, Math.cos(2*Math.PI*_offset/_segment)*_radius, 0);
}
private function drawCircle():void {
_offset += 1;
_endVertex=new Vertex3D(Math.sin(2*Math.PI*_offset/_segment)*_radius, Math.cos(2*Math.PI*_offset/_segment)*_radius, 0);
_lines.addLine(new Line3D(_lines, _lineMaterial, 10, _beginVertex, _endVertex));
_beginVertex = _endVertex;
}
private function onEnterFrame(e:Event):void
{
if (_offset < _segment) {
drawCircle();
}else {
_lines.pitch(1);
}
singleRender();
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------
PV3D中材质的种类非常多,都是MaterialObject3D的子类,每个显示对象都需要材质才能显示。我们先来大致看一下所有的材质类:
MaterialObject3D
————LineMaterial
————ParticleMaterial
————————BitmapParticleMaterial
————————MovieAssetParticleMaterial
————TriangleMaterial
————————AbstractLightShadeMaterial
————————————AbstractSmoothShadeMaterial
————————————————EnvMapMaterial
————————————————————CellMaterial
————————————————————PhongMaterial
————————————————GouraudMaterial
————————————FlatShadeMaterial
————————BitmapMaterial
————————————BitmapAssetMaterial
————————————BitmapColorMaterial
————————————BitmapFileMaterial
————————————BitmapViewportMaterial
————————————MovieMaterial
————————————————MovieAssetMaterial
————————————————VideoStreamMaterial
————————BitmapWireframeMaterial
————————ColorMaterial
————————CompositeMaterial
————————ShadedMaterial
————————WireframeMaterial
————VectorShapeMaterial
————————Letter3DMaterial
上面列出了PV3D中所有的材质,大家可以先看一下,有个印象,以后用到的话方便查文档。下面看一下比较常用的几个。
ColorMaterial
ColorMaterial是最常用的一个材质,它只有单纯的颜色和透明度,看下构造函数
ColorMaterial (color:Number = 0xFF00FF, alpha:Number = 1, interactive:Boolean = false)
主要说下interactive这个参数,如果你需要你的三维物体接收交互(例如鼠标点击)的话要将它设为true,还有就是经常问到的一个问题,怎么实现鼠标手型,首先要将viewport的interactive设为true,然后将材质的interactive也设为true以后,在显示对象上监听InteractiveScene3DEvent.OBJECT_OVER事件,监听器中将viewport的buttonMode设为true(前面说过viewport是Sprite的子类,所以可以设置buttonMode),鼠标离开事件里再设为false就可以了,关于交互以后会专门学习下给大家分享。
照例上代码:
---------------------------------------------------------------------------------------------------------------------------------------
package
{
import gs.TweenLite;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
public class InteractivePlane extends BasicView
{
private var _plane:Plane
private var _material:ColorMaterial;
public function InteractivePlane()
{
super();
init()
}
private function init():void
{
initPanel();
startRendering();
}
private function initPanel():void
{
_material = new ColorMaterial(0x1D9DAD, 1, true);
_material.interactive = true;
_plane = new Plane(_material,500,500);
_plane.rotationX = 45;
scene.addChild(_plane);
viewport.interactive = true;
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onOver);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onOut);
_plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);
}
private function onClick(e:InteractiveScene3DEvent):void
{
_material.fillColor = Math.random() * 0xffffff;
}
private function onOver(e:InteractiveScene3DEvent):void
{
viewport.buttonMode = true;
TweenLite.to(_plane, 1, { rotationX:0 } );
}
private function onOut(e:InteractiveScene3DEvent):void
{
viewport.buttonMode = false;
TweenLite.to(_plane, 1, { rotationX:45 } );
}
}
}
---------------------------------------------------------------------------------------------------------------------------------------
代码中创建了一个平面,然后给它了一个ColorMaterial的材质,然后监听鼠标的OVER,OUT,CLICK事件,当鼠标移上去的时候平面转动一定角度并出现手型,移开的话转动复原手型消失,当点击的时候给ColorMaterial的fillColor属性重新赋值改变平面颜色。
相关推荐
这个教程集合提供了深入学习Papervision3D所需的知识,包括PV3D的基本概念、对象模型、渲染技术以及与Flex框架的集成。 1. **Papervision3D基础**:Papervision3D是Flash平台上的3D引擎,它允许开发者在网页和桌面...
通过深入学习这些知识点,并结合提供的Papervision3D学习资料,开发者能够掌握创建动态、交互式3D Flash应用的技能,从而在Web开发领域开辟新的可能性。在实际应用中,不断实践和探索将使你更加熟练地运用...
"papervision3d.rar"可能包含的是PV3D的基础教程、示例项目以及更全面的API文档。通过这些资源,开发者可以系统地学习PV3D的架构和工作原理,理解如何构建复杂的3D场景和交互。 全景案例,如"Ball360.zip",是PV3D...
关于文件名列表中的"PaperVision3D",这可能是一个包含完整示例代码、文档或者教程的资源包。通常,这样的资源会帮助开发者快速上手,了解如何初始化场景、加载模型、设置动画以及处理用户交互等。开发者可以通过...
为了更好地理解这些概念,我们可以通过一个简单的实例来学习如何使用Papervision3D: 1. **准备工作**:首先需要下载Papervision3D的库文件并将其添加到项目中。原文推荐了一个名为“pv3d傻瓜包”的资源包,这个...
《PaperVision3D SDK在Flex环境中的应用与实践》 PaperVision3D(简称PV3D)是一款基于Adobe Flex和ActionScript 3.0的开源3D图形库,它为Web开发者提供了在Flash Player环境中构建三维图形和交互式应用程序的能力...
**学习基础知识** 理解3D空间的概念,如坐标系、轴向、旋转和平移等,对于使用PV3D至关重要。书籍中通常会涵盖这些基础知识,并通过实例演示如何在PV3D中应用它们。 #### 3. **创建3D模型** PV3D支持多种3D模型...
这个教程的翻译由多个志愿者完成,每个人负责一部分章节,虽然可能存在翻译质量和风格的差异,但总体上为学习Papervision3D提供了丰富的资源。对于英文熟练的用户,建议直接阅读英文原著以获取最准确的信息。 请...
- 原作者Paul Tondeur和Jeff Winder是Papervision3D领域的专家,他们结合自身丰富的实践经验撰写了这本教程。 - 本书的中文翻译版由多位热心的志愿者共同完成,并且得到了社区的支持。 #### 2. 准备环境 - **设置...
Papervision3D是一个基于Flash的开源库,用于创建2D和3D交互式图形。...学习并理解Papervision3D可以帮助开发者创建引人入胜的3D交互式体验,同时也可以为他们打下坚实的基础,以适应不断变化的Web图形技术。
- **在线教育工具**:分析Papervision 3D在教育领域的应用案例,例如模拟实验、互动教程等。 #### 五、最佳实践 - **调试技巧**:介绍有效的调试方法和技术,帮助开发者快速定位并解决问题。 - **社区资源**:列出...
综上所述,这个压缩包提供的是一份全面的Papervision3D学习资源,对于想要掌握Flash平台3D编程的开发者来说非常有价值。它涵盖了Papervision3D的基本原理、使用方法以及实际应用,帮助开发者在Flash环境中创建...
PV3D全称为PaperVision3D,是一款专为Adobe Flash平台设计的开源3D渲染引擎,能够帮助开发者在网页上创建复杂的3D场景和交互式应用。 此CHM(Compiled Help Manual)格式的文档提供了快速查找功能,使得开发者可以...
《Away3D基础教程》是一本专注于Flash 3D开发的资源集合,旨在帮助开发者掌握Away3D这一强大的开源框架。Away3D是基于ActionScript 3.0的,为Flash Player和Adobe AIR平台提供了高性能的3D图形渲染能力。在Flash 3D...
Papervision3D Essentials 中文.pdf 和 Papervision3D.Essentials.Se09.pdf 这两份文档很可能是关于Papervision3D的基础教程和进阶指南。其中,“Essentials”通常意味着这些资源将涵盖Papervision3D的基本概念,如...
8. **学习资源**:除了源代码本身,初学者还可以通过在线教程、论坛和文档进一步深入学习PaperVision3D和AS3 3D编程。 9. **向WebGL过渡**:随着HTML5和WebGL的发展,许多开发者开始转向这些技术进行3D游戏开发。...
6. ** 物理模拟**:如果包含相关章节,可能会介绍如何整合物理引擎,如Box2D或Papervision3D,实现真实感的碰撞检测和物理行为。 7. ** 声音与特效**:可能涉及3D音频处理,以及如何添加粒子效果、雾化或其他视觉...
【PV3D实例—交互】是关于Papervision3D(PV3D)框架的一个实践教程,重点探讨了在3D环境中实现交互性。Papervision3D是一个流行的开源ActionScript 3库,用于在Adobe Flash平台上构建三维图形和应用程序。这个实例...
Flash 3D指的是在Flash平台上实现的3D图形技术,这通常涉及到像 Away3D、Papervision3D 或 Alternativa3D 这样的第三方库,它们扩展了Flex和ActionScript的3D功能。通过这些例子和教程,学习者可以掌握如何在Flex...