学习一下papervision3D。Papervision3D Essentials学习笔记(一)
1:场景Scene
Scene是在3D空间由3D对象组成的一个整体。你可以认为它是有x、y、z三个有的flash舞台,每个你希望可以看到的对象都应该添加到场景。如果你不把对象添加到场景,那么这些对象是不会显示在你的屏幕上的。
2:摄像机Camera
你可以认为这是真正的摄像机,它在 3d 空间中不断的记录场景的活动.摄影机确定了查看场景的
点.因为3d空间的相机不是可视对象,它不是场景的组成部分不必添加它.摄影机可以像真实的相机
一样缩放和聚焦.
3d空间的相机可以做更多的事.如,在3d中对象距离相机过近或过远时将剔除此对象防止它被
渲染.相机可以忽略某些在不可见区域的对象.这些都是出于性能考虑的.对象距离太远或处于相机
后面,不需来记录,这时会节省很多计算的资源.
3:观察口 Viewport
观察口是一个舞台上的sprite容器,输出相机记录下来的对象.对象介绍中,观察口好比相机的镜头.
镜头是我们放在 3d 场景上面的窗口.
我们可以缩小这个窗口则可以只看到 3d 场景的一小部分,放大一些就看的多一些.观察口如现实中
真实窗口一样—窗口越大看到的外面世界越大,它影响到我们究竟可以看到多少场景.
要把渲染结果输出到屏幕上我们需要一个 场景,摄像机,观察口,有材质的 3d
对象,和一个渲染引擎.
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;//摄像机
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;//引擎
import org.papervision3d.scenes.Scene3D;//场景
import org.papervision3d.view.Viewport3D;//观察口
public class FirstApplication extends Sprite
{
//场景是必须的,是 3D 对象的载体.创建了一个无参的 Scene3D 类的实例
private var scene:Scene3D;
//添加一个 Camera3D,跟创建场景一样容易. 摄像机在创建时可以指定参数,现在使用默认值.
private var camera:Camera3D;
//一个内置的球体.
private var sphere:Sphere;
//现在我们拥有了一个场景,一个摄像机,和一个球体,现在我们需要建立好可以观察到 3D 场景的窗口.我们需要定义观察口并将其加入到舞台以使其可见. 创建新观察口时,我们可以传递可选的参数,否则观察口将使用默认的参数.
private var viewport:Viewport3D;
private var renderEngine:BasicRenderEngine;
public function FirstApplication()
{
stage.frameRate = 40;
scene = new Scene3D();
camera = new Camera3D();
sphere = new Sphere();
scene.addChild(sphere);
viewport = new Viewport3D();
addChild(viewport);
// 现在距离完工只有一步之遥了.我们需要获取到我们滚动的摄像机.这是渲染引擎定义好的,它将渲染场景并将拍到的图像发送至观察口.
renderEngine = new BasicRenderEngine();
renderEngine.renderScene(scene, camera, viewport);
//
addEventListener(Event.ENTER_FRAME, render);
}
private function render(e:Event):void
{
sphere.localRotationY +=1;
renderEngine.renderScene(scene, camera, viewport);
}
}
}
使用更短的代码:
每次我们准备创建一个 Papervision3D 应用我们可以拷贝这个类到新的应用中去.但有没有更简洁的方式呢?每个
Papervision3D 项目都包含了基本的组件—摄影机、场景、渲染器、观察口.每次定义并引入这些类都在重复劳动.聪明的程序员便想办法找出一个更高效的方案.很幸运,Papervision3D
包含了一个 BasicView 类.此类包含我们需要的基本组件.BasicView 是继承自 Sprite 的,我们可以实例化它并加入到舞台去或用来扩展我们的文档类.本书将使用它.
import flash.events.Event;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;
public class BasicViewExample extends BasicView
{
private var sphere:Sphere;
public function BasicViewExample()
{
stage.frameRate = 40;
sphere = new Sphere();
scene.addChild(sphere);
startRendering();
}
override protected function onRenderTick(e:Event=null):void
{
sphere.localRotationX +=1;
super.onRenderTick();
}
}
}