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差不多。
好就写到这里
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.****.net/jiangjunshow