

几何体顶点位置数据和点模型对象Points
缓冲类型几何体BufferGeometry
threejs的而长方体BoxGeometyr
、球体SphereGeometry
等几何体都是基于BufferGeometry
类构建的,BufferGeomerty
是一个没有任何形状的空几何体,你可以通过BufferGeomerty
自定义任何几何形状,具体一点说就是定义顶点数据。
顶点模型
第一步、创建一个空的几何体对象
typescript
// 创建一个空的几何体对象
const geometry = new THREE.BufferGeometry();
第二步、添加顶点数据
typescript
// 添加顶点数据
const vertices = new Float32Array([
0,0,0,
50,0,0,
0,100,0,
0,0,10,
0,0,100,
50,0,10
])
第三步、3个为一组,表示一个顶点的xyz坐标
typescript
const attribue = new THREE.BufferAttribute(vertices,3)
第四步、设置几何体顶点属性与点材质
typescript
geometry.attributes.position = attribue;
// 点材质
const material = new THREE.PointsMaterial({
color:0xffff00,
size:10
})
const points = new THREE.Points(geometry,material)
第五步、导出点模型
typescript
export default points;
第六步、场景中引入添加点模型
typescript
import model from './model.js';//模型对象
//场景
const scene = new THREE.Scene();
scene.add(model); //模型对象添加到场景中
第七步、查看效果

线模型Line渲染顶点数据
把几何体作为线模型Line
的参数,渲染效果是从第一个点开始到最后一个点依次连城线。
第一步、设置线材质对象
typescript
// 点材质
const material = new THREE.LineBasicMaterial({
color:0xffff00,
})
第二步、创建线模型对象
typescript
// 创建线模型对象
const line = new THREE.Line(geometry,material)
第三步、场景中引入添加线模型
typescript
import line from './model.js';//模型对象
//场景
const scene = new THREE.Scene();
scene.add(line); //模型对象添加到场景中
第四步、查看效果

第五步、闭合线模型定义及效果
typescript
const line = new THREE.LineLoop(geometry,material)

第六步、非连续线模型定义及效果
typescript
const line = new THREE.LineSegments(geometry,material)

网格模型(三角形概念)
网格模型Mesh
渲染自定义几何体BufferGeomerty
的顶点坐标,也就是三角形面的概念。 网格模型Mesh
其实就是一个一个三角形面拼接起来形成的,使用网格模型Mesh
渲染几何体geometry
,就是几何体所有顶点坐标三个为一组,构成一个三角形,多个定点构成多个三角形,就可以采用模拟表示物体的表面。
正反面基本概念
正面:逆时针。 反面:顺时针。 空间中一个三角形有正反两个面,three.js
的规则是根据你的眼睛也就是相机对着三角形的一个面,如果三个顶点的顺序是逆时针方向,该面是为正面,如果三个顶点的顺序是顺时针,该面视为反面。
基本三角形面
typescript
// 设置几何体的顶点位置属性
import * as THREE from 'three'
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// 引入stats性能监视器
import Stats from 'three/examples/jsm/libs/stats.module.js';
// 创建3D场景对象Scene
const scene = new THREE.Scene();
// 创建一个空的几何体定点对象
const geometry = new THREE.BufferGeometry();
// 添加顶点数据
const vertices = new Float32Array([
0,0,0,
50,0,0,
0,100,0,
0,0,10,
0,0,100,
50,0,10
])
// 3个为一组,表示一个顶点的xyz坐标
const attribue = new THREE.BufferAttribute(vertices,3)
// 设置几何体的顶点位置属性
geometry.attributes.position = attribue;
const material = new THREE.MeshBasicMaterial({
color:0x00ffff,
side:THREE.FrontSide // 默认只有正面可见
})
// 创建线模型对象
const mesh = new THREE.Mesh(geometry,material)
export default mesh;
导入场景加入三角面:
typescript
import mesh from './model.js';//模型对象
//场景
const scene = new THREE.Scene();
scene.add(mesh); //模型对象添加到场景中

正面可见
typescript
const material = new THREE.MeshBasicMaterial({
color:0x00ffff,
side:THREE.FrontSide // 默认只有正面可见
})
// 创建线模型对象
const mesh = new THREE.Mesh(geometry,material)
export default mesh;

双面可见
threeJS
的材质默认正面刻间,反面不可见。
只有背面可见
typescript
const material = new THREE.MeshBasicMaterial({
color:0x00ffff,
side:THREE.BackSide // 默认只有正面可见
})
// 创建线模型对象
const mesh = new THREE.Mesh(geometry,material)
export default mesh;

自定义矩形几何体
上面说的都是自定义几何体BufferGeometry
的基础,可以去尝试自己去构建一个矩形平面几何体。
定义矩形几何体顶点坐标
一个矩形平面,至少通过两个三角形拼接而成,而且两个三角形有两个顶点的坐标是重合的。 注意三角形的正反面问题:保证矩形平面两个三角形的正面都是一样的,从另一个方向观察两个三角形都是顺时针或者逆时针。 根据上图坐标添加顶点数据
typescript
// 添加顶点数据
const vertices = new Float32Array([
0,0,0,
80,0,0,
80,80,0,
0,0,0,
80,80,0,
0,80,0
])
// 3个为一组,表示一个顶点的xyz坐标
const attribue = new THREE.BufferAttribute(vertices,3)
// 设置几何体的顶点位置属性
geometry.attributes.position = attribue;
const material = new THREE.MeshBasicMaterial({
color:0x00ffff,
})
// 创建线模型对象
const mesh = new THREE.Mesh(geometry,material)
export default mesh;

几何体顶点索引数据
基本概念
网格模型Mesh
对应的几何体BufferGeometry
,才分为多个三角后,很多三角形重合顶点位置坐标是相同的,这时候如果你想减少顶点坐标数据,可以借助顶点索引geometry.index
来实现。 通过js
类型化数组Uint16Array
创建顶点索引.index数据。 根据下面顶点坐标
typescript
const vertices = new Float32Array([
0,0,0,
80,0,0,
80,80,0,
0,0,0,
80,80,0,
0,80,0
])
第一步、删除重复顶点数据
不难发现,上面的 [0,0,0],[80,80,0]已经重复,通过顶点索引可以写成
typescript
// 添加顶点数据
const vertices = new Float32Array([
0,0,0, // 0
80,0,0, // 1
80,80,0, // 2
0,80,0 // 3
])
第二步、类型化数组创建顶点数据
typescript
// 类型化数组创建顶点数据
const indexes = new Uint16Array([
0,1,2,0,2,3
])

第四步、索引数据赋值给几何体index属性
通过threejs
的属性缓冲区对象BufferAttribute
表示几何体顶点索引.index
typescript.
// 设置几何体的顶点位置属性
geometry.attributes.position = attribue;
// 索引数据赋值给几何体index属性
geometry.index = new THREE.BufferAttribute(indexes,1)
第五步、查看效果

顶点法线数据
数学发现概念,比如一个平面,法线就是该平面的垂线,如果是光滑曲面,一点的法线就是该点切面的法线,threeJS
中法线和数学中法线概念差不多,姿势定义的时候比较灵活。
typescript
const norlmals = new Float32Array([
0,0,1, // 顶点1法向量
0,0,1, // 顶点2法向量
0,0,1, // 顶点3法向量
0,0,1, // 顶点4法向量
0,0,1, // 顶点5法向量
0,0,1 // 顶点6法向量
])
//定义了顶点法线数据或者说定点法向量数据
geometry.attributes.norlmals = new THREE.BufferAttribute(norlmals,3)
geometry.index = new THREE.BufferAttribute(indexes,1)
const material = new THREE.MeshBasicMaterial({
color:0x00ffff,
})
// 创建线模型对象
const mesh = new THREE.Mesh(geometry,material)
export default mesh;

自带几何体顶点结构,基类(BufferGeometry)
three
提供了矩形平面,长方体,球体等各种形状的几何体,这些几何体都有一个共同的父类BufferGeometry
,这意味着这些及课题都有哪些属性和方法可以直接查询BufferGeometry
文档即可。
矩形平面

typescript
import * as THREE from 'three'
const geometry = new THREE.PlaneGeometry(100,100) // 定义矩形平面
const material = new THREE.MeshLambertMaterial({
color:0x00ffff
})
const mesh = new THREE.Mesh(geometry,material)
export default mesh;
矩形几何体

typescript
import * as THREE from 'three'
const geometry = new THREE.BoxGeometry(100,100,150) // 定义矩形几何体
const material = new THREE.MeshLambertMaterial({
color:0x00ffff
})
const mesh = new THREE.Mesh(geometry,material)
export default mesh;
材质属性.wireframe
:线条模式渲染,查看几何体三角形结构。
几何体细分数
threejs
很多几何体都提供了细分数相关的参数,这里以矩形平面几何体PlaneGeometry
为例 矩形平面几何体至少需要两个三角形拼接而成。 把一个矩形分为两份,每个矩形
2
个三八角形,总共是4
个三角形。 把一个矩形分为
4
份,每个矩形两个3
角形,总共是8
个三角形。
球体细分数
typescript
import * as THREE from 'three'
const geometry = new THREE.SphereGeometry(50) // 定义矩形平面
const material = new THREE.MeshLambertMaterial({
color:0x00ffff,
wireframe:true
})
const mesh = new THREE.Mesh(geometry,material)
export default mesh;
细分数越多越趋近于圆形:
const geometry = new THREE.SphereGeometry(50,6,6) // 定义矩形平面
三角形数量与性能
对于一个曲面而言,细分数越大,表面越光滑,但是三角形和顶点数量却越多,几何体三角形数量或者说顶点数量直接影响three.js
的渲染性能,在不影响渲染效果的情况下,一般尽量越少越好。
几何体的旋转
几何体通过.rotateX()
,.rotateY()
方法可以对几何体进行旋转,本是都是改变几何体的顶点数据。 geometry.rotateX(Math.PI/5)
几何体的缩放
几何体通过scale()
进行缩放:const geometry = new THREE.PlaneGeometry(100,100) // 定义矩形平面
几何体平移方法
几何体通过.translate()
进行平移:geometry.translate(50,0,0)
几何体居中
居中:geometry.center()