PV3DPrimitives学习笔记

每一个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.所用过的两种类型的材质:

原文地址:https://www.cnblogs.com/ywxgod/p/1687645.html