Skip to content

geometry.attributes.normal

测试:Basic 材质改为 Lambert 材质

可以测试下,把前面两节课的案例源码中 MeshBasicMaterial 材质改为 MeshLambertMaterial 材质,你会发现原来的矩形平面无法正常渲染,这其实很简单,使用受光照影响的材质,几何体 BufferGeometry 需要定义顶点法线数据.

js
// MeshBasicMaterial不受光照影响
// 使用受光照影响的材质,几何体Geometry需要定义顶点法线数据
const material = new THREE.MeshLambertMaterial({
  color: 0x0000ff,
  side: THREE.DoubleSide, //两面可见
});

数学上的法线概念

先来理解一下数学上的法线概念,比如一个平面,法线的就是改平面的垂线,如果是光滑曲面,一点的法线就是该点切面的法线

Three.js 的顶点法线

Three.js 中法线和数学中法线概念相似,只是定义的时候更灵活,会根据需要进行调整,作为初学者,只要先有顶点法线的概念就行,下面会举一个简单小例子

矩形平面几何体法线案例——无顶点索引

Three.js 中法线是通过顶点定义,默认情况下,每个顶点都有一个法线数据,就像每一个顶点都有一个位置数据一样

js
// 矩形平面,无索引,两个三角形,6个顶点
// 每个顶点的法线数据和顶点位置数据一一对应
const normals = 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法线
]);
// 设置几何体的顶点法线属性.attributes.normal
geometry.attributes.normal = new THREE.BufferAttribute(normals, 3);

矩形平面几何体法线案例——有顶点索引

js
// 矩形平面,有索引,两个三角形,有2个顶点重合,有4个顶点
// 每个顶点的法线数据和顶点位置数据一一对应
const normals = new Float32Array([
  0,
  0,
  1, //顶点1法线( 法向量 )
  0,
  0,
  1, //顶点2法线
  0,
  0,
  1, //顶点3法线
  0,
  0,
  1, //顶点4法线
]);
// 设置几何体的顶点法线属性.attributes.normal
geometry.attributes.normal = new THREE.BufferAttribute(normals, 3);

上次更新于: