自定义几何体
可以直接使用BoxGeometry直接创建一个立方体几何体,调用SphereGeometry创建一个球体几何体。
下面代码通过Three.js引擎的BufferGeometry和BufferAttribute两个API自定义一个具有六个顶点数据的几何体:
1 | var geometry = new THREE.BufferGeometry() //创建一个buffer类型几何体对象 |
通过自定义的几何体创建一个网络模型,对于网络模型而言,几何体所有顶点每三个顶点作为一组可以确定一个三角形,几何体是六个顶点,也就是说可以绘制三个三角形。
1 | //三角面(网格)渲染模式 |
点模型points
为了更好的理解几何体是由顶点构成的,可以把几何体geometry作为点模型Points而不是网格模型Mesh的参数,你会发现上面的六个点坐标会渲染为六个方形的点区域,可以用下面代码代替上面的网格模型部分代码测试效果。
对于网格模型Mesh而言,几何体geometry三个顶点为一组渲染出来一个三角形,对于点模型Points而言,几何体的每个顶点对应位置都会渲染出来一个方形的点区域,该区域可以设置大小。
1 | // 点渲染模式 |
线模型Line
上面两个案例适用点模型和网格模型去渲染几何体的顶点数据,下面代码是把几何体作为线模型Line参数,你会发现渲染效果是从第一个点开始到最后一个点,依次连成线。
1 | // 线条渲染模式 |
几何体本质
查看下面一段代码,你可以看出来立方体网格模型Mesh是由立方体几何体geometry和材质material两部分构成,立方体几何体BoxGeometry本质上就是一系列的顶点构成,只是Threejs的APIBoxGeometry把顶点的生成细节封装了,用户可以直接使用。比如一个立方体网格模型,有6个面,每个面至少两个三角形拼成一个矩形平面,每个三角形三个顶点构成,对于球体网格模型而言,同样是通过三角形拼出来一个球面,三角形数量越多,网格模型表面越接近于球形。
顶点颜色数据插值计算
通常几何体顶点位置坐标数据和几何体顶点颜色数据都是一一对应的,比如顶点1有一个顶点位置坐标数据,也有一个顶点颜色数据,顶点2同样也有一个顶点位置坐标数据,也有一个顶点颜色数据…
每个顶点设置一种颜色
1 | var geometry = new THREE.BufferGeometry() //声明一个缓冲几何体 |
材质属性vertextColors
原来是通过材质的颜色属性color设置模型颜色,而本案例并没有这样设置,而是设置了材质属性.vertexColors。
属性.vertexColors的默认值是THREE.NoColors,这也就是说模型的颜色渲染效果取决于材质属性.color,如果把材质属性.vertexColors的值设置为THREE.VertexColors,threejs渲染模型的时候就会使用几何体的顶点颜色数据geometry.attributes.color。
属性缓冲区对象BufferAttribute
Threejs提供的接口BufferAttribute目的是为了创建各种各样顶点数据,比如顶点颜色数据,顶点位置数据,然后作为几何体BufferGeometry的顶点位置坐标属性BufferGeometry.attributes.position、顶点颜色属性BufferGeometry.attributes.color的值。
颜色插值
如果你把几何体作为网格模型Mesh或者线模型Line构造函数的参数,你会发现渲染出渐变的彩色效果。
之所以出现渐变是因为Threejs通过底层WebGL进行渲染的时候会对顶点的颜色数据进行插值计算。颜色插值计算简单点说,比如一条直线的端点1设置为红色,端点2设置为蓝色,整条直线就会呈现出从点1到红色点2的蓝色颜色渐变,对于网格模型Mesh而言,就是三角形的三个顶点分别设置一个颜色,三角形内部的区域像素会根据三个顶点的颜色进行插值计算。
顶点法向量数据光照计算
比如太阳光照在一个物体表面,物体表面与光线夹角位置不同的区域明暗程度不同,WebGL中为了计算光线与物体表面入射角,你首先要计算物体表面每个位置的法线方向,在Threejs中表示物体的网格模型Mesh的曲面是由一个一个三角形构成,所以为了表示物体表面各个位置的法线方向,可以给几何体的每个顶点定义一个方向向量。
下面代码仅仅定义了几何体BufferGeometry的顶点位置数据,没有定义顶点法向量数据。没有法向量数据,点光源、平行光等带有方向性的光源不会起作用,三角形平面整个渲染效果相对暗淡,而且两个三角形分界位置没有棱角感。

1 | var geometry = new THREE.BufferGeometry(); //声明一个空几何体对象 |
定义几何体顶点
在上面顶点位置数据基础上定义顶点法向量数据,这时候除了环境光以外,点光源也会参与光照计算,三角形整个表面比较明亮,同时两个三角形表面法线不同,即使光线方向相同,明暗自然不同,在分界位置有棱角感。

1 | var normals = new Float32Array([ |
顶点法向量数据和前面两节课讲解到的顶点位置数据、顶点颜色数据一样都是一一对应的。