第一个PV3D App



 我们开始写 Papervision3D 的代码前,我们需要知道更多一些 Papervision3D 面的 3D.接
下来的这部分会让你更明白所写的那些代码.这些概念跟 Papervision3D 用到的类有直接关系.本
章,将使用这些来完成第一个应用.我们所说的对象都是 3D 场景里活动的元素.让我们看一下这些
对象:

 

场景 Scene
    Scene 是在 3d 空间由 3d 对象组成的一个整体.就如 flash 里有 3 个轴的舞台(stage)-x,y,z.
每个可视对象都可以添加到场景.如不添加到场景中就不会在出现在屏幕上.
摄影机 Camera
  可以想象成一个真实的相机,它在 3d 空间中不断的记录场景的活动.摄影机确定了查看场景的
点.因为3d空间的相机不是可视对象,它不是场景的组成部分不必添加它.摄影机可以像真实的相机
一样缩放和聚焦.
 3d空间的相机可以做更多的事.如,在3d中对象距离相机过近或过远时将剔除此对象防止它被
渲染.相机可以忽略某些在不可见区域的对象.这些都是出于性能考虑的.对象距离太远或处于相机
后面,不需来记录,这时会节省很多计算的资源.
观察口 Viewport
观察口是一个舞台上的sprite容器,输出相机记录下来的对象.对象介绍中,观察口好比相机的镜头.
镜头是我们放在 3d 场景上面的窗口.
我们可以缩小这个窗口则可以只看到 3d 场景的一小部分,放大一些就看的多一些.观察口如现实中
真实窗口一样—窗口越大看到的外面世界越大,它影响到我们究竟可以看到多少场景.
 下面的图解包含了一个大的观察口,右侧是一个小而宽的观察口.黑边框画出了观察口区域.右
侧的图很好的说明了观察口如何影响我们所看到的物体.



 

3D对象
在 3d 空间中的图形被称为一个 3d 对象,在 Papervision3D 中叫 DisplayObject3D.可以将其想
象成一个更高级的可视化对象如 sprite 和 movieclip.不同的是 DisplayObject3D 有第三个轴,
我们可以让其绕 3 轴进行旋转.
材质 Material
  材质是附着在对象表面上的结构.当对象没有附着材质时,它是不可见的.可以使用很多材质.如

 一个简单的材质:颜色;高级的材质可能是:流(live stream).第四章会用到所有的材质.
渲染引擎Render engine
渲染引擎像一个滚动的相机.只要渲染引擎开始工作,它会输出相机记录下来的信息给观察口.
当停止渲染引擎时观察口不会有任何新的信息输出仅仅会看到最后的那张图像.渲染是计算机中最
繁重的任务,它需要重复计算你场景内部的对象并输出他们到观察口去.
左手定则笛卡尔坐标系
Flash,Papervision3D,都使用笛卡尔坐标系.在 Flash 中,一个规则的可视化对象可以通过设置
x,y 值改变其在舞台的位置.对象依靠 x,y 的值与舞台左上角的关系来确定位置.x 值越大对象越靠
右,y 值增大对象便向下移动.
 Papervision3D 里面的坐标系工作一致,只有 2 点不同之处.
  Flash 使用了笛卡尔坐标系的 2 个轴,而 Papervision3D 使用了 3 个轴
  Papervision3D 里的y 轴与 Flash 里面的 y 轴相反.
在 Papervision3D 中,我们不但要设置可视化对象的 x,y 轴,还要设置其额外的轴,为了确定对
象的深度.第三轴称为 z轴.
  在 Flash 中,依靠左上角的关系来摆放对象,这点是(0,0).称为中心点或原点.可想而
知,Papervision3D 中的原点是(0,0,0).



 
图中(+,-)的标志说明了坐标值相对于原点是增加还是减少.[注意]y 轴与 Flash2D 坐标系是相
反的.若准备将对象放置到屏幕的下方,需要给 y 轴更大的值.这是 2D 坐标的工作情况.上面的
图解说明了 Papervision3D 坐标系里的 y 轴情况.
(注:这样想 Flash 的坐标原点在屏幕的左上角,Papervision3D 的坐标原点在屏幕的左下角)
创建一个基础的 Papervision3D类
前面学习了基础场景的使用,和如何创建自定义类.现在我们要开始实践.
 使用你顺手的工具.第一个应用我们将创建一个3D场景包含一个可绕y轴旋转的球体.球
体是 Papervision3D 内置的一个基本体.
基本文档类
首先,看一下定义了旋转球体应用结构的文档类.

 

package { 
  import flash.display.Sprite; 
  
  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 
  { 
    private var scene:Scene3D; 
    private var viewport:Viewport3D; 
    private var camera:Camera3D; 
    private var renderEngine:BasicRenderEngine; 
    private var sphere:Sphere; 
    
    public function FirstApplication() 
    { 
      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); 
    } 
  } 
} 

 

 

现在细说下,我们可以在 Flash,Flexbuilder,FlashBuilder 中建立一个新工程之后创建一个
名为 FirstApplication 的文档类.不要忘记在 FlexBuilder,FlashBuilder 中导入
Papervision3D 的代码.
此前,我们了解到要把渲染结果输出到屏幕上我们需要一个 场景,摄像机,观察口,有材质的 3d
对象,和一个渲染引擎.[注意]文档类需要继承 Sprite.之前我们需要将其引入.
 
import flash.display.Sprite;
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;
 
现在,引入完毕,我们开始定义变量.
private var scene:Scene3D;
private var viewport:Viewport3D;
private var camera:Camera3D;
private var renderEngine:BasicRenderEngine;
private var sphere:Sphere;

我们只是定义了变量,并没有赋初始值.我们在构造器中进行赋初值.
public function FirstApplication()
{
}
现在开始创建一个 3D场景.场景是必须的,是 3D 对象的载体.
  scene = new Scene();
创建了一个无参的 Scene3D 类的实例.
接着,添加一个 Camera3D,跟创建场景一样容易.
camera = new Camera3D();
摄像机在创建时可以指定参数,现在使用默认值.只要场景中没有 3D 对象,场景和摄像机都很
少用到.本例用到了一个内置的球体.
 sphere = new Sphere();
Camera和Sphere 都可以在创建时指定参数,若不指定则自动使用默认值.
现在我们的球体创建完毕,需要加入到场景中,否则摄像机无法观察到它.如同在 Flash 中添加
规则对象的步调一致,通过使用 addChild().
  scene.addChild(sphere);
看起来很像,对吗?
现在我们拥有了一个场景,一个摄像机,和一个球体,现在我们需要建立好可以观察到 3D 场景
的窗口.我们需要定义观察口并将其加入到舞台以使其可见.
 viewport = new Viewport3D();
 addChild(viewport);
创建新观察口时,我们可以传递可选的参数,否则观察口将使用默认的参数.
 现在距离完工只有一步之遥了.我们需要获取到我们滚动的摄像机.这是渲染引擎定义好
的,它将渲染场景并将拍到的图像发送至观察口.
renderEngine = new BasicRenderEngine();
renderEngine.renderScene(scene,camera,viewport);
现在用渲染场景指令来渲染场景.运行后会得到一下的图像:



 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值