这篇我们来看一下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
结束每帧渲染
了解了这些属性和方法,我们来看一段代码,这段代码实现了和前面教程完全一样的效果。
?[Copy to clipboard]View Code ACTIONSCRIPT3package {
import flash.events.Event;
import org.papervision3d.materials.WireframeMaterial;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
/**
* ...
* @author AntScript
* @blog http://www.antscript.cn
*/
[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);
}
}
}
看效果
熟悉BasicView并熟练使用它,以后很多时候都会很方便的。
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的作用差不多,只是这个是累加的
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就可以了,关于交互以后会专门学习下给大家分享。
照例上代码:
?[Copy to clipboard]View Code ACTIONSCRIPT3package
{
import gs.TweenLite;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.ColorMaterial;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.view.BasicView;
/**
* ...
* @author AntScript
* @blog http://www.AntScript.cn
*/
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属性重新赋值改变平面颜色。
看效果
另外比较常用的还有位图材质BitmapMaterial和带阴影的材质FlatShadeMaterial,使用方法网上都很多大家google一下。