1、基本形状包括:
o3djs.primitives.createCylinder(pack, material, 1, 2, 30, 30) //半径为1高度为2的圆柱体
o3djs.primitives.createCube(pack,material,1); // 一个单位的正六面体
o3djs.primitives.createSphere(pack, material, 1, 30, 30) // 一个单位的球体
o3djs.primitives.createPlane(pack, material, 1, 1, 20, 20)//创建一个四边形平面
o3djs.primitives.createPrism(pack,material,polygon,1); //创建一个多边形,Z轴深度为1,polygon 顶点数组
createRainbowCube(pack, material, 1);彩色六面体
2、基础的几何形状包括:
POINTLIST, 离散的点
LINELIST, 离散的线
LINESTRIP, 连续的线
TRIANGLELIST, 离散的三角面
TRIANGLESTRIP, 带状三角面
TRIANGLEFAN 扇形三角面
3、形状的数据组成
顶点数据有下列组成:
POSITION, 顶点位置坐标
TEXTURE, 顶点纹理坐标
COLOR, 顶点颜色坐标
NORMAL, 顶点法线向量
TANGENT,顶点切线向量
BINORMAL,顶点次法线向量
indexBuffer ,面得顶点索引
其中,法线是为进行光照计算使用,纹理坐标是为纹理贴图使用,如果你不使用纹理,就要给每个顶点设置颜色。
4、如何创建一个几何形状
1)设置几何形状的顶点坐标、法线向量、颜色、纹理坐标等数据数组,其中顶点数据必须,其他可选。
2)设置面得数据索引数组。确定哪三个顶点组成一个三角面。
3)创建形状对象、图元对象、数据流对象,将对象关联到图元对象。
4)设置图元对象的基础几何形状类型、顶点数量、面得数量。
5)创建数据缓存对象,包括顶点数据缓存、法线数据缓存、纹理数据缓存、颜色数据缓存。根据第一步设置的数据确定;并设置数据格式,包括(float,float2,floa3)等;将数据数组加入到数据缓存中。
6)将数据缓存中的数据加入到数据流中。
7)将面的索引数组加入到图元对象的所有数据缓存中。
var positionArray = [-0.5, -0.5, 0.5, // 顶点0
0.5, -0.5, 0.5, // 顶点1
-0.5, 0.5, 0.5, // 顶点2
0.5, 0.5, 0.5, // 顶点3
-0.5, 0.5, -0.5, // 顶点4
0.5, 0.5, -0.5, // 顶点5
-0.5, -0.5, -0.5, // 顶点6
0.5, -0.5, -0.5 // 顶点7
];
var indicesArray = [
0, 1, 2, // 面1 每个面包含两个三角面
2, 1, 3,
2, 3, 4, // 面2
4, 3, 5,
4, 5, 6, // 面3
6, 5, 7,
6, 7, 0, // 面4
0, 7, 1,
1, 7, 3, // 面5
3, 7, 5,
6, 0, 4, // 面6
4, 0, 2 ];
var cubeShape = g_pack.createObject('Shape'); //创建几何形状对象
var cubePrimitive = g_pack.createObject('Primitive');//创建图元对象
var streamBank = g_pack.createObject('StreamBank');//创建流数据对象
cubePrimitive.material = material;//关联材质对象
cubePrimitive.owner = cubeShape;//关联形状对象
cubePrimitive.streamBank = streamBank;//关联流数据对象
cubePrimitive.primitiveType = g_o3d.Primitive.TRIANGLELIST;//几何形体的类型是离散三角型
cubePrimitive.numberPrimitives = 12;//12个三角面
cubePrimitive.numberVertices = 8; //8个顶点
var positionsBuffer = g_pack.createObject('VertexBuffer'); //创建顶点缓存对象
var positionsField = positionsBuffer.createField('FloatField', 3); //设置顶点缓存数据格式
positionsBuffer.set(positionArray); //将顶点数据加入到顶点缓存中
var indexBuffer = g_pack.createObject('IndexBuffer'); //创建索引缓存
indexBuffer.set(indicesArray);//将索引数据加入到索引缓存中
streamBank.setVertexStream(g_o3d.Stream.POSITION,0,positionsField,0);//设置数据流
cubePrimitive.indexBuffer = indexBuffer; //关联索引缓存对象