papervision3d学习笔记 第一个程序

               

进行这个程序之前:请到http://code.google.com/p/papervision3d/ 下载相关的类库,采用的是2.8的版本,注意版本的选择,不然会产生错误。

进行学习引擎的时候,其实我也是采取摸索的状态去看。很多时候,在某一些情况,如果知道了一些技巧的东西,学习这个引擎其实很简单的事情,但是做的好不好,还是要继续探讨。

在使用3d的引擎的时候,要注意几种常见的概念:如摄影机,渲染,视窗等。这些如果你学习3d相关的模型,那就不是一个问题。

我们都知道,显示的编程,在没有加入显示菜单的时候,图形是仅仅存在内存里面。Flash playe虚拟机并没有渲染图形出来,而3d引擎里面的显示对象也是一样的。只有通过渲染,才能显示出来,但是这个渲染过程,其实又是回归显示列表里面。如果你对as3编程有一点了解addChild 绝对是你常用的方法。好,我们看看如何的一个过程。

 

首先:写一个类继承Sprite对象

public class Example extends Sprite  

 {    

        public function Example()  

        {  

            init3D(); //进行对3d一个初始化

        }  

}

 

 private function init3D():void  

        {  

    //实现初始化过程

 }

 

 

把基本的框架弄好了,接下来我们需要进行引人,3d世界当中,我们需要一台摄影机,一个渲染器,一个观察事物的视窗,场景

如:

 private var viewport:Viewport3D=new Viewport3D(550,400);/视窗,观察事物的窗口

 private var renderer:BasicRenderEngine= new BasicRenderEngine();//引擎渲染器

private var camera:Camera3D= new Camera3D();//3d摄影机

 

认识两个类,一个是Viewport3D,另外一个是渲染器,一个是摄影机,把三种元素集合到3d世界里面当去,接下来,我们还是需要进行引入i个基本的图像,如球体,立方体,我们引入球体,因为比较简单。易操作性。

 

private var sphere:Sphere = new Sphere(new BitmapFileMaterial('map.jpg'),200, 24, 24);  

 

在这个类里面,从名称上看,Sphere是球的意思,至于参数里面分为四个参数

Sphere(material:MaterialObject3D = null, radius:Number = 100, segmentsW:int = 8, segmentsH:int = 6)

 

material:MaterialObject3D  材质编辑:

,radius:Number = 100  半径:

segmentsW:int = 8   宽段数

segmentsH:int = 6   高段数:

后面的数字越大,圆越精细,但是要付出相应的时间和空间的代价。

 

部署完之后,为了能够进行渲染,我们还要准备一些工作?这个工作不难,仅仅需要我们创建一个场景

private var sence:Scene3D = new Scene3D();  

 

然后,将我们的基本的图像添加窗口当中如:sence.addChild(sphere); 看起来sence就好像是一个容器类,或者比喻他是一个场景管理者。完成了这部分工作,我们可以进行渲染的了。

  renderer.renderScene(sence, camera, viewport); 

利用我们上面创建的渲染器进行渲染。

 

 

 

基础图像模拟:package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.*; import org.papervision3d.cameras.Camera3D; import org.papervision3d.scenes.Scene3D; import org.papervision3d.materials.*; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.objects.primitives.*; public class Example extends Sprite {  private var objet:DisplayObject3D = new DisplayObject3D();  private var viewport:Viewport3D=new Viewport3D(550,400);//³õʼ»¯´°¿Ú  private var renderer:BasicRenderEngine= new BasicRenderEngine();//³õʼ»¯äÖȾÆ÷  private var camera:Camera3D= new Camera3D();  private var sphere:Sphere = new Sphere(new BitmapFileMaterial('map.jpg'),200, 24, 24);  private var sence:Scene3D = new Scene3D();  public function Example()  {   init3D();  }  private function init3D():void  {   addChild(viewport);   camera.z =-500;   sence.addChild(sphere);   addEventListener(Event.ENTER_FRAME, Run);  }  private function Run(event:Event):void  {   sphere.rotationX += 1;   sphere.rotationY += 1;   renderer.renderScene(sence, camera, viewport);  } }}

 

 

 

 

我们要准备一张位图:而在圆这里的参数就是引入一张位图贴图。看起来这个类还是很简单了。

new BitmapFileMaterial('map.jpg')

 

经过上面的过程,我们基本上能够创建一个基本的图像了。

 

 

 

 

地球

 

看了sandy之后,尝试了一下papervision3d,大体上都有很多相同之处,运行过程当中还是需要建立到摄影机,创建景,创建渲染机,贴图,移动等大部分都有共同的地方,这样学起来就容易一些。不过在学这个papervision3d的时候,要注意版本的更新,版本选择,因为在看以前的程序的时候,发现程序改变了很多,所以这个要注意。

上面是一个建立小球的过程。并且外部贴图。

 

 

解析:

 

private var viewport:Viewport3D=new Viewport3D(550,400);//建立视窗

private var renderer:BasicRenderEngine= new BasicRenderEngine();//创建渲染引擎 

 private var camera:Camera3D= new Camera3D();//建立摄影机

 

 

 

      addChild(viewport);//添加窗口到显示列表当中

都是使用这种策略来进行。说白一点就是纸上画图。

      sence.addChild(sphere);//场景添加球

      renderer.renderScene(sence, camera, viewport);//进行渲染过程

 

 

 

 

无论怎样结果,都是转为显示列表才可以显示出来,基本上目前的3d引擎

 

 

 

2.创建一个立方体:

在这一点上,我觉得sandy比p3d做的好。结构上思路舒服很多。

package { import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.*; import org.papervision3d.cameras.Camera3D; import org.papervision3d.scenes.Scene3D; import org.papervision3d.materials.*; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.view.Viewport3D; import org.papervision3d.render.BasicRenderEngine; import org.papervision3d.objects.primitives.*;    import org.papervision3d.materials.utils.MaterialsList; public class Example2 extends Sprite {  private var objet:DisplayObject3D = new DisplayObject3D();  private var viewport:Viewport3D=new Viewport3D(550,400);//³õʼ»¯´°¿Ú  private var renderer:BasicRenderEngine= new BasicRenderEngine();//³õʼ»¯äÖȾÆ÷  private var camera:Camera3D= new Camera3D();  private var cude:Cube = new Cube(new MaterialsList({all:new BitmapFileMaterial('map.jpg')}),200,200,200);  private var sence:Scene3D = new Scene3D();  public function Example2()  {   init3D();  }  private function init3D():void  {   addChild(viewport);   camera.z =-500;   sence.addChild(cude);   addEventListener(Event.ENTER_FRAME, Run);  }  private function Run(event:Event):void  {   cude.rotationX += 1;   cude.rotationY += 1;   renderer.renderScene(sence, camera, viewport);  } }}

 

在这里修改仅仅是一句:

              private var cude:Cube = new Cube(new MaterialsList({all:new BitmapFileMaterial('map.jpg')}),200,200,200);//贴图方式改变了。

 

但是在贴图方式已经进行了修改,和圆的贴图方式不一样,这一点我认为p3d做的不够好

但是显示出来的效果和sandy差不多。

tietu

好就写到这里

 

 

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow