PV3D--Primitives学习笔记
每一个DisplayObject3D都有顶点,三角形的面
Vertices,triangles------分别对应于Vertical3D类,Triangle3D类
Vertical3D类负责创建顶点。
Triangle3D类负责通过顶点来创建面,继而创建3d对象;
Plane参数-----平面
注意的地方:
Plane.material.doubleSided = true;//设置两面都显示
Sphere参数-----球体
Sylinder参数-----柱体
将参数6设置为0,将会变为圆锥;将7,8设置为false,将会变为一个圆筒;
Cone参数----圆锥
Cube参数----立方体
立方体有六个面,可以分别赋予每个面不同的材质,所以Cube的构造函数第一个参数与前面的3d对象MaterialObject3D不同,它是一个MaterialList对象,MaterialList定义了六个面,负责添加立方体的六个面不同的材质。具体用法如下:
1.先定义每个面具体的材质
var red:ColorMaterial = new ColorMaterial(0xff0000); var green:ColorMaterial = new ColorMaterial(0x00ff00); var blue:ColorMaterial = new ColorMaterial(0x0000ff);
2.定义一个MaterialList对象,并实例化
var materialsList:MaterialsList = new MaterialsList();
3.分别向MaterialList对象中添加六个面的不同材质
materialsList.addMaterial(red,"front"); materialsList.addMaterial(red,"back"); materialsList.addMaterial(green,"top"); materialsList.addMaterial(green,"bottom"); materialsList.addMaterial(blue,"left"); materialsList.addMaterial(blue,"right");
在MaterialList对象中六个面分别被命名为front,back,left,right,top,bottom,添加的时候可以逐个对应添加,如上代码;也可以一次性添加六个面得材质,只需如下一句代码:
materialsList.addMaterial(blue,"all");
立方体具体参数列表如下:
参数5,6,7分别表示立方体在x,y,z方向上的三角形的个数,三角形越多立方体越精确,但所消耗的cpu时间也越多,具体情况再具体定值。下面的图例解释这三个参数:
第7个参数表示:从立方体里面来看,里面的面是否可见。假设你只想看到立方体的每一个面得背面,你可以将摄像机置于立方体里面,此时可以设置此参数值为Cube.ALL;如果想除了左边的面得背面看不到,而要看到其他面得背面,那可以设置为Cube.ALL-Cube.LEFT;
第8个参数表示:立方体不创建的面。和上面一样也可以通过加减来设置此参数。
PaperPlane参数设置---纸飞机
只有两个参数:材质和缩放倍数
创建一个纸飞机实例如下:
由于在构造函数中没有定义具体的长宽高,那如何确定和获取其长宽高呢?
Vertices3D类的boundingBox()方法计算3d对象的边界盒,返回任何一个3d对象在x,y,z方向的长度。如上代码将输出:x:100,y:33.33,z:200 ,这是纸飞机默认的长宽高。如果要改变其默认的长宽高,例如将宽度设为200,则可以在其构造函数中第二个参数传入2,将其放大2倍。也可以单独设置scaleX和scaleY参数来设置它的宽度高度的缩放比例。
Arrow参数----箭头
只有一个参数:材质。默认值为空
创建箭头,如下代码:
Nesting----嵌套3d对象
上面的例子中都是直接将对象(plane,sphere,cube等。。。)addChild到scene中来。其实可以在任何一个3d对象上调用addChild方法将新的对象添加到自身,新添加的对象将作为已有对象的子对象,就像Flash中嵌套的MC一样。
DisplayObject3D继承自DisplayObjectContainer3D;Scene3D继承自SceneObject3D,SceneObject3D又继承自DisplayObjectContainer3D;
Scene3D与DisplayObject3D都继承了DisplayObjectContainer3D的addChild方法,这就是说他们都可以添加子对象,即所说的嵌套。
全局坐标与局部坐标
定义两个球体,首先是父级球体,将其添加到场景中。
再定义子级球体,将其添加到父级球体中,并设置其x坐标为400,
然后在渲染时,改变父级球体的y方向的角度,并没有直接改变子级球体的角度。
运行测试,将会看到父级球体绕着y轴旋转,且子级球体也一样旋转。
子级是以父级的坐标系作为参考,父级的坐标系相对于子级来说是一个局部坐标系,上面子级球体的x坐标为400,是指的是在父级坐标系中的值。子级的全局坐标则表示在场景中的坐标。要想取得子级球体的全局坐标可以调用sceneX,sceneY,sceneZ属性,分别返回子级球体在场景中三个方向的坐标,用下面的图,可以很好的解释全局坐标与局部坐标之间的关系,如下图:
访问顶点
3d显示对象的顶点保存在一个数组里,可以通过以下属性访问:
如果要遍历顶点,例如遍历一个平面的所有定点,
顶点中的x,y,z是可读写的,可以改变任意一个顶点的值,如下:
总结
1. Pv3d提供了一些基本的3d模型,如平面,立方体,圆柱体,椎体,纸飞机,箭头等,无需我们自己去创建。
2. 任何一个3d对象都是由一些3维空间的点组成,称为顶点。这些三维的点被投影到2维的屏幕中,继而连线形成三角形。每一个三角形都由3个顶点组成,多个三角形组成一个3d对象,一个三角形网格。
3. Pv3d的渲染管道有如下一些列的过程:
1. 初始化-----主要是创建viewport,camera,renderer,scene和一些基本的3d对象以及对象的材质。
2. 投影或者映射-----将3d坐标系中的点映射到2d的屏幕上,影射的仅仅是3d对象的顶点,三角形网格不被映射。
3. 渲染------根据2d屏幕上的三角形,顶点信息绘制出材质等。
4. 可以添加3d对象到场景中也可以将3d对象嵌套添加的另一个3d对象中。直接添加DisplayObject3D对象到场景中,将不会显示,因为它没有顶点和三角形网格。
5. 所讨论过的3d对象的属性列表
6.所用过的两种类型的材质: 。
E-mail:给我发邮件
出处:http://ywxgod.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。