Three.js 基础- 第 2 章 - 几何体BufferGeometry

2023-11-01

Three.js 基础- 第 2 章 - 几何体BufferGeometry

Three.js教程:几何体BufferGeometry

在Three.js中,几何体是3D对象的基本形状。本教程将介绍如何使用缓冲类型几何体BufferGeometry和BufferAttribute来定义几何体顶点数据,并学习如何使用点模型Points。

缓冲类型几何体BufferGeometry

在Three.js中,缓冲类型几何体BufferGeometry是一种用于存储顶点数据的高效方式。它将顶点数据存储在缓冲区中,而不是存储在JavaScript数组中,这种方式比传统的几何体类型更加高效,因为它可以减少内存使用和CPU开销。

我们可以通过以下代码创建一个缓冲类型几何体BufferGeometry:

const geometry = new THREE.BufferGeometry();

BufferAttribute定义几何体顶点数据

我们可以使用BufferAttribute来定义几何体的顶点数据,BufferAttribute是一个包含缓冲区数据的类,它定义了每个顶点的属性。

以下是一个例子,我们定义了一个包含4个顶点的三角形:

const positionArray = new Float32Array([
  0, 0, 0, // 顶点1
  1, 0, 0, // 顶点2
  0, 1, 0, // 顶点3
  1, 1, 0  // 顶点4
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

在这个代码中,我们首先定义了一个包含12个浮点数的数组,代表4个顶点的x、y、z坐标。然后我们创建了一个BufferAttribute对象,将其绑定到这个数组上,并将其添加到几何体的attributes中。

设置几何体顶点.attributes.position

现在我们已经定义了顶点数据,我们需要将顶点数据绑定到几何体的顶点属性上。我们可以使用以下代码将顶点属性绑定到几何体上:

geometry.setAttribute('position', positionAttribute);

点模型Points

在Three.js中,我们可以使用点模型Points来表示一组点。以下是一个例子,我们创建了一个包含1000个随机点的点模型:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array(1000 * 3);

for (let i = 0; i < positionArray.length; i++) {
    positionArray[i] = Math.random() - 0.5;
}

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const material = new THREE.PointsMaterial({color: 0xffffff});
const points = new THREE.Points(geometry, material);
scene.add(points);

在这个例子中,我们首先定义了一个包含1000个顶点的数组,每个顶点的位置是随机生成的。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上。 接下来,我们创建了一个PointsMaterial和一个Points对象,将几何体和材质传递给Points对象,并将Points对象添加到场景中。

Three.js教程:线模型对象

在Three.js中,线模型对象可以用于表示一系列连续的线段或折线。本教程将介绍如何使用线模型对象,并学习如何使用线模型Line、LineLoop和LineSegments。

线模型Line渲染顶点数据

在Three.js中,我们可以使用线模型Line来表示一系列连续的线段。以下是一个例子,我们创建了一条连接两个顶点的线段:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 起点
  1, 1, 0  // 终点
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const material = new THREE.LineBasicMaterial({ color: 0xffffff });
const line = new THREE.Line(geometry, material);
scene.add(line);

在这个例子中,我们首先定义了一个包含两个顶点的数组,代表线段的起点和终点的x、y、z坐标。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上。 接下来,我们创建了一个LineBasicMaterial和一个Line对象,将几何体和材质传递给Line对象,并将Line对象添加到场景中。

线模型LineLoop、LineSegments

除了Line模型外,Three.js还提供了LineLoop和LineSegments模型,它们分别用于表示封闭的连续线和多个独立的线段。

以下是一个例子,我们创建了一个包含4个顶点的矩形,并使用LineLoop模型将其表示为一个封闭的连续线:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 左下角
  1, 0, 0, // 右下角
  1, 1, 0, // 右上角
  0, 1, 0, // 左上角
  0, 0, 0  // 左下角(重复一次,封闭线段)
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const material = new THREE.LineBasicMaterial({ color: 0xffffff });
const lineLoop = new THREE.LineLoop(geometry, material);
scene.add(lineLoop);

在这个例子中,我们定义了一个包含5个顶点的数组,前4个顶点代表矩形的四个角,最后一个顶点代表矩形的左下角(重复一次,将线段封闭)。然后我们创建了一个LineBasicMaterial和一个LineLoop对象,将几何体和材质传递给LineLoop对象,并将LineLoop对象添加到场景中。

以下是一个例子,我们创建了两条线段,并使用LineSegments模型将其表示为两个独立的线段:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 第一条线段起点
  1, 1, 0, // 第一条线段终点
  1, 0, 0, // 第二条线段起点
  0, 1, 0  // 第二条线段终点
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const material = new THREE.LineBasicMaterial({ color: 0xffffff });
const lineSegments = new THREE.LineSegments(geometry, material);
scene.add(lineSegments);

在这个例子中,我们定义了一个包含4个顶点的数组,前两个顶点代表第一条线段的起点和终点,后两个顶点代表第二条线段的起点和终点。然后我们创建了一个LineBasicMaterial和一个LineSegments对象,将几何体和材质传递给LineSegments对象,并将LineSegments对象添加到场景中。

Three.js教程:网格模型与三角形概念

在Three.js中,网格模型是3D对象的基本形状之一。网格由一组三角形面组成,本教程将介绍三角形概念和网格模型的正反面,以及如何设置网格模型的双面可见性。

三角形(面)

在3D图形中,三角形是最基本的图形单元之一,它由3个顶点和3条边组成。在Three.js中,我们可以使用THREE.Face3类来表示三角形面。

以下是一个例子,我们创建了一个包含两个三角形面的网格模型:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 顶点1
  1, 0, 0, // 顶点2
  0, 1, 0, // 顶点3
  1, 1, 0  // 顶点4
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const indexArray = new Uint16Array([
  0, 1, 2, // 第一个三角形面
  1, 3, 2  // 第二个三角形面
]);

const indexAttribute = new THREE.BufferAttribute(indexArray, 1);
geometry.setIndex(indexAttribute);

const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们定义了一个包含4个顶点的数组,每个顶点的位置是随机生成的。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上。

接下来,我们定义了一个包含6个索引值的数组,每3个索引值代表一个三角形面的3个顶点。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上,并将其设置为几何体的索引属性。

接着,我们创建了一个MeshBasicMaterial和一个Mesh对象,将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

网格模型三角形:正反面

在Three.js中,我们定义的三角形面具有正反面之分。默认情况下,网格模型只会渲染三角形面的正面,而不渲染背面。这是通过Three.js的背面剔除(backface culling)机制实现的。

以下是一个例子,我们创建了一个包含两个三角形面的网格模型,并将其背面设置为不可见:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 顶点1
  1, 0, 0, // 顶点2
  0, 1, 0, // 顶点3
  1, 1, 0  // 顶点4
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const indexArray = new Uint16Array([
  0, 1, 2, // 第一个三角形面
  1, 3, 2  // 第二个三角形面
]);

const indexAttribute = new THREE.BufferAttribute(indexArray, 1);
geometry.setIndex(indexAttribute);

const material = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.FrontSide });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们定义了一个包含4个顶点的数组和一个包含6个索引值的数组,与上一个例子类似。然后我们创建了一个MeshBasicMaterial,并将其side属性设置为THREE.FrontSide,表示只渲染三角形面的正面。

双面可见

如果我们想要网格模型的所有三角形面都可见,可以将材质的side属性设置为THREE.DoubleSide:

const material = new THREE.MeshBasicMaterial({ color: 0xffffff, side: THREE.DoubleSide });

这样,所有三角形面的正反面都会被渲染。

Three.js教程:构建一个矩形平面几何体

在Three.js中,平面几何体是建模的基本单元之一。本教程将介绍如何构建一个矩形平面几何体,并学习如何定义矩形几何体的顶点坐标。

定义矩形几何体顶点坐标

在Three.js中,我们可以使用BufferGeometry类来定义几何体的顶点坐标。以下是一个例子,我们创建了一个包含4个顶点的矩形平面几何体:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 左下角
  1, 0, 0, // 右下角
  1, 1, 0, // 右上角
  0, 1, 0  // 左上角
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

在这个例子中,我们定义了一个包含4个顶点的数组,每个顶点的位置是x、y、z坐标。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上。

接下来,我们将BufferAttribute对象设置为几何体的position属性,表示这些顶点坐标定义了几何体的形状。

添加材质和渲染

定义几何体的顶点坐标只是创建一个3D对象的第一步。我们还需要为几何体添加材质和将其渲染到场景中。

以下是一个例子,我们创建了一个包含4个顶点的矩形平面几何体,并使用MeshBasicMaterial将其渲染到场景中:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 左下角
  1, 0, 0, // 右下角
  1, 1, 0, // 右上角
  0, 1, 0  // 左上角
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们定义了一个包含4个顶点的数组和一个BufferAttribute对象,与上一个例子类似。然后我们创建了一个MeshBasicMaterial,并将其color属性设置为0xffffff,表示使用白色作为材质颜色。

最后,我们创建了一个Mesh对象,将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

Three.js教程:几何体顶点索引数据

在Three.js中,除了定义几何体的顶点位置坐标数据之外,还可以定义几何体的顶点索引数据。本教程将介绍如何定义顶点位置坐标数据和顶点索引数据,以及如何使用BufferAttribute来定义顶点索引数据。

定义顶点位置坐标数据

在Three.js中,我们可以使用BufferGeometry类来定义几何体的顶点位置坐标数据。以下是一个例子,我们创建了一个包含4个顶点的平面矩形几何体:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 左下角
  1, 0, 0, // 右下角
  1, 1, 0, // 右上角
  0, 1, 0  // 左上角
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

在这个例子中,我们定义了一个包含4个顶点的数组,每个顶点的位置是x、y、z坐标。然后我们创建了一个BufferAttribute对象,并将其绑定到这个数组上。

接下来,我们将BufferAttribute对象设置为几何体的position属性,表示这些顶点坐标定义了几何体的形状。

BufferAttribute定义顶点索引数据

除了定义顶点位置坐标数据之外,我们还可以使用BufferAttribute来定义顶点索引数据。在Three.js中,顶点索引数据是一组整数,表示哪些顶点连接成三角形面。

以下是一个例子,我们创建了一个包含4个顶点的平面矩形几何体,并使用BufferAttribute来定义顶点索引数据:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  0, 0, 0, // 左下角
  1, 0, 0, // 右下角
  1, 1, 0, // 右上角
  0, 1, 0  // 左上角
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
geometry.setAttribute('position', positionAttribute);

const indexArray = new Uint16Array([
  0, 1, 2, // 第一个三角形面
  0, 2, 3  // 第二个三角形面
]);

const indexAttribute = new THREE.BufferAttribute(indexArray, 1);
geometry.setIndex(indexAttribute);

在这个例子中,我们定义了一个包含4个顶点的数组和一个BufferAttribute对象,与上一个例子类似。然后我们创建了一个Uint16Array类型的数组,表示哪些顶点连接成三角形面。这个数组的长度必须是3的倍数,每3个索引值代表一个三角形面的3个顶点。

接着,我们创建了一个BufferAttribute对象,并将其绑定到这个数组上,并将其设置为几何体的索引属性。

Three.js教程:顶点法线数据

在Three.js中,顶点法线是一项重要的技术,用于计算光照和阴影等效果。本教程将介绍如何使用Three.js来处理顶点法线数据,以及如何在矩形平面几何体中使用顶点法线。

测试:Basic材质改为Lambert材质

在介绍顶点法线之前,我们先来测试一下Basic材质和Lambert材质的区别。

在Three.js中,Basic材质是最简单的材质,没有光照效果。而Lambert材质是一种具有光照效果的材质,可以模拟漫反射光照。

以下是一个例子,我们创建了一个包含4个顶点的矩形平面几何体,并将其材质从Basic材质改为Lambert材质:

const geometry = new THREE.PlaneGeometry(1, 1);
const material = new THREE.MeshLambertMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们创建了一个PlaneGeometry对象和一个MeshLambertMaterial对象,并将它们传递给Mesh对象。然后将Mesh对象添加到场景中。

数学上法线概念

在Three.js中,顶点法线是用来定义表面法线向量的向量。表面法线向量是指垂直于表面的向量,用来描述表面的朝向和光照效果。

在数学上,表面法线向量是由表面上三个点的向量叉积得到的。具体来说,假设三个点分别为A、B、C,则表面法线向量N的计算公式为:

N = (B - A) × (C - A)

其中,×表示向量的叉积运算。

Three.js顶点法线

在Three.js中,我们可以使用BufferGeometry类来定义顶点法线。以下是一个例子,我们创建了一个包含4个顶点和顶点法线的矩形平面几何体:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  -1, -1, 0,
   1, -1, 0,
   1,  1, 0,
  -1,  1, 0
]);
const normalArray = new Float32Array([
  0, 0, 1,
  0, 0, 1,
  0, 0, 1,
  0, 0, 1
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
const normalAttribute = new THREE.BufferAttribute(normalArray, 3);
geometry.setAttribute('position', positionAttribute);
geometry.setAttribute('normal', normalAttribute);

const material = new THREE.MeshLambertMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们定义了一个包含4个顶点的数组和一个包含4个顶点法线向量的数组。然后我们创建了两个BufferAttribute对象,并将它们绑定到这两个数组上。

接着,我们将BufferAttribute对象设置为几何体的position属性和normal属性,表示这些顶点坐标和顶点法线定义了几何体的形状和光照效果。

最后,我们创建了一个MeshLambertMaterial对象,并将其color属性设置为0xffffff,表示使用白色作为材质颜色。然后将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

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

在上一个例子中,我们定义了一个不带顶点索引的矩形平面几何体,并为每个顶点指定了法线向量。但是,这种方法不太适用于较复杂的几何体,因为它需要为每个顶点指定法线向量。

以下是一个例子,我们创建了一个带顶点索引的矩形平面几何体,并为其计算法线向量:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  -1, -1, 0,
   1, -1, 0,
   1,  1, 0,
  -1,  1, 0
]);
const indexArray = new Uint16Array([
  0, 1, 2,
  0, 2, 3
]);

geometry.setAttribute('position', new THREE.BufferAttribute(positionArray, 3));
geometry.setIndex(new THREE.BufferAttribute(indexArray, 1));

geometry.computeVertexNormals();

const material = new THREE.MeshLambertMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们定义了一个带顶点索引的矩形平面几何体,其顶点位置坐标和顶点索引数组与前面的例子相同。然后我们使用setIndex方法将索引数组设置为几何体的索引属性。

接着,我们调用computeVertexNormals方法,自动计算每个顶点的法线向量。这个方法会遍历每个三角形面,并计算每个面的法线向量,然后将每个顶点的法线向量设置为相邻三角形面法线向量的平均值。

最后,我们创建了一个MeshLambertMaterial对象,并将其color属性设置为0xffffff。然后将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

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

在上一个例子中,我们使用了computeVertexNormals方法自动计算了每个顶点的法线向量。但是,这种方法在某些情况下可能会影响性能,因为它需要遍历每个三角形面。

以下是一个例子,我们手动计算矩形平面几何体的法线向量:

const geometry = new THREE.BufferGeometry();
const positionArray = new Float32Array([
  -1, -1, 0,
   1, -1, 0,
   1,  1, 0,
  -1,  1, 0
]);
const indexArray = new Uint16Array([
  0, 1, 2,
  0, 2, 3
]);

const positionAttribute = new THREE.BufferAttribute(positionArray, 3);
const normalAttribute = new THREE.BufferAttribute(new Float32Array(positionArray.length), 3);

geometry.setAttribute('position', positionAttribute);
geometry.setAttribute('normal', normalAttribute);
geometry.setIndex(new THREE.BufferAttribute(indexArray, 1));

for (let i = 0; i < indexArray.length; i += 3) {
  const a = indexArray[i];
  const b = indexArray[i + 1];
  const c = indexArray[i + 2];

  const v1 = new THREE.Vector3().fromArray(positionArray, a * 3);
  const v2 = new THREE.Vector3().fromArray(positionArray, b * 3);
  const v3 = new THREE.Vector3().fromArray(positionArray, c * 3);

  const normal = new THREE.Vector3();
  normal.crossVectors(v2.clone().sub(v1), v3.clone().sub(v1)).normalize();

  normalAttribute.setXYZ(a, normal.x, normal.y, normal.z);
  normalAttribute.setXYZ(b, normal.x, normal.y, normal.z);
  normalAttribute.setXYZ(c, normal.x, normal.y, normal.z);
}

const material = new THREE.MeshLambertMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们手动计算了矩形平面几何体的法线向量。首先,我们创建了一个包含4个顶点和顶点索引的数组,与前面的例子相同。

然后,我们创建了一个BufferAttribute对象,并将其绑定到一个空的Float32Array数组上,这个数组的大小与顶点位置坐标数组相同。这个数组将用于存储顶点法线向量。

接着,我们将BufferAttribute对象设置为几何体的position属性和normal属性,表示这些顶点坐标和顶点法线定义了几何体的形状和光照效果。

接下来,我们遍历每个三角形面,并计算这个面的法线向量。这个方法与上面的数学公式类似,使用了三个顶点的坐标向量的叉积运算来计算法线向量。

最后,我们将计算得到的法线向量设置到每个顶点对应的法线属性中。

Three.js教程:查看自带几何体顶点

在Three.js中,我们可以使用自带的几何体来创建模型。本教程将介绍如何查看自带几何体的顶点结构、位置和索引数据,以及如何使用wireframe属性和细分数等属性。

查看three.js自带几何体顶点结构,基类(父类)BufferGeometry

在Three.js中,几何体是由顶点和面组成的。顶点包含位置、法线、颜色等属性,而面则由顶点索引构成。

我们可以使用BufferGeometry类来创建几何体,并使用getAttribute方法来访问几何体的属性。以下是一个例子,我们创建了一个SphereGeometry对象,并查看了它的顶点和索引属性:

const geometry = new THREE.SphereGeometry(1, 32, 32);
console.log(geometry);
console.log(geometry.getAttribute('position'));
console.log(geometry.getIndex());

在这个例子中,我们创建了一个32面体的SphereGeometry对象,并使用console.log方法打印了这个对象和它的position属性和index属性。

查看几何体顶点位置和索引数据

在上一个例子中,我们查看了SphereGeometry对象的顶点和索引属性。position属性是一个BufferAttribute对象,包含了所有顶点位置的坐标数据。而index属性是一个BufferAttribute对象,包含了所有面的顶点索引数据。

以下是一个例子,我们从几何体的position属性和index属性中获取所有顶点位置和面的顶点索引,并打印它们的数据:

const positionArray = geometry.getAttribute('position').array;
const indexArray = geometry.getIndex().array;

console.log(positionArray);
console.log(indexArray);

在这个例子中,我们从几何体的position属性和index属性中获取了它们的数据,并使用console.log方法打印了它们。

材质属性.wireframe

在Three.js中,我们可以使用wireframe属性将几何体渲染为线框模式。以下是一个例子,我们创建了一个SphereGeometry对象,并将它的材质的wireframe属性设置为true:

const geometry = new THREE.SphereGeometry(1, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们创建了一个32面体的SphereGeometry对象,并创建了一个MeshBasicMaterial对象,并将其color属性设置为0xffffff,表示使用白色作为材质颜色。然后将wireframe属性设置为true,表示将几何体渲染为线框模式。

最后,我们将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

几何体细分数

在Three.js中,我们可以使用细分数来控制几何体的精细程度。细分数越高,几何体的面数就越多,它的表面就越平滑。

以下是一个例子,我们创建了一个细分数为4的CubeGeometry对象,并将它的材质的wireframe属性设置为true:

const geometry = new THREE.BoxGeometry(1, 1, 1, 4, 4, 4);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们创建了一个4x4x4的CubeGeometry对象,其中细分数为4。然后我们创建了一个MeshBasicMaterial对象,并将其color属性设置为0xffffff,表示使用白色作为材质颜色。最后,将wireframe属性设置为true,表示将几何体渲染为线框模式。

球体SphereGeometry细分数

在上一个例子中,我们使用了细分数来创建一个CubeGeometry对象。而在SphereGeometry对象中,细分数通常用来控制球体的细节程度。

以下是一个例子,我们创建了一个细分数为16的SphereGeometry对象,并将它的材质的wireframe属性设置为true:

const geometry = new THREE.SphereGeometry(1, 16, 16);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);

在这个例子中,我们创建了一个16面体的SphereGeometry对象,并创建了一个MeshBasicMaterial对象,并将其color属性设置为0xffffff,表示使用白色作为材质颜色。然后将wireframe属性设置为true,表示将几何体渲染为线框模式。

三角形数量与性能

在Three.js中,渲染一个包含大量三角形面的模型可能会影响性能。因此,我们应该尽量减少三角形的数量。

以下是一些减少三角形数量的方法:

  • 使用细分数来控制几何体的精细程度
  • 使用几何体的顶点索引来共享顶点数据
  • 使用LOD(Level of Detail)技术,在远处使用低多边形数的模型,在近处使用高多边形数的模型。

Three.js教程:旋转、缩放、平移几何体

在Three.js中,我们可以使用缩放、平移和旋转等操作来修改几何体的位置和形状。本教程将介绍如何使用.scale()、.translate()和.rotateX()、.rotateY()、.rotateZ()等方法来实现这些操作,并介绍如何使用.center()方法将几何体居中。

缩放.scale()

在Three.js中,我们可以使用.scale()方法来缩放几何体。这个方法接受一个THREE.Vector3对象作为参数,表示沿每个坐标轴的缩放比例。

以下是一个例子,我们创建了一个BoxGeometry对象,并将它沿x轴和y轴方向缩放了2倍:

const geometry = new THREE.BoxGeometry(1, 1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
mesh.scale.set(2, 2, 1);
scene.add(mesh);

在这个例子中,我们创建了一个1x1x1的BoxGeometry对象,并创建了一个MeshBasicMaterial对象。然后将几何体的scale属性设置为(2, 2, 1),表示沿x轴和y轴方向缩放了2倍。

最后,我们将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

平移.translate()

在Three.js中,我们可以使用.translate()方法来平移几何体。这个方法接受一个THREE.Vector3对象作为参数,表示在每个坐标轴上的平移距离。

以下是一个例子,我们创建了一个SphereGeometry对象,并将它沿x轴方向平移了2个单位:

const geometry = new THREE.SphereGeometry(1, 32, 32);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
mesh.translateX(2);
scene.add(mesh);

在这个例子中,我们创建了一个32面体的SphereGeometry对象,并创建了一个MeshBasicMaterial对象。然后将几何体的translateX属性设置为2,表示沿x轴方向平移了2个单位。

最后,我们将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

旋转.rotateX()、.rotateY()、.rotateZ()

在Three.js中,我们可以使用.rotateX()、.rotateY()、.rotateZ()方法来旋转几何体。这些方法接受一个表示旋转角度的弧度值作为参数。

以下是一个例子,我们创建了一个PlaneGeometry对象,并将它绕x轴旋转了45度:

const geometry = new THREE.PlaneGeometry(1, 1);
const material = new THREE.MeshBasicMaterial({ color: 0xffffff });
const mesh = new THREE.Mesh(geometry, material);
mesh.rotateX(Math.PI / 4);
scene.add(mesh);

在这个例子中,我们创建了一个1x1的PlaneGeometry对象,并创建了一个MeshBasicMaterial对象。然后将几何体的rotateX属性设置为Math.PI / 4,表示绕x轴旋转了45度。

最后,我们将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

居中.center()

在Three.js中,我们可以使用.center()方法将几何体居中。这个方法会将几何体的中心点移到原点(0, 0, 0)处。

以下是一个例子,我们创建了一个CylinderGeometry对象,并将它居中:

const geometry = new THREE.CylinderGeometry(1, 1, 2, 32);
const material = new THREE.MeshBasicMaterial({color: 0xffffff});
const mesh = new THREE.Mesh(geometry, material);
mesh.center();
scene.add(mesh);

在这个例子中,我们创建了一个高度为2、顶部和底部半径均为1的圆柱体几何体,并创建了一个MeshBasicMaterial对象。然后调用.center()方法将几何体居中。

最后,我们将几何体和材质传递给Mesh对象,并将Mesh对象添加到场景中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.js 基础- 第 2 章 - 几何体BufferGeometry 的相关文章

随机推荐

  • 根据进程id获得本地Java应用的JMX 属性

    1 Getting the Service URL When the local management agent is started it publishes the service URL which also contains th
  • Python,OpenCV中的光学字符识别OCR文章汇总

    Python OpenCV中的光学字符识别OCR文章汇总 Python OpenCV中的光学字符识别 OCR Optical Character Recognition 使用Python OpenCV OCR检测护照图像中的机器可读区域 M
  • vue 项目报错 There are multiple modules with names that only differ in casing.

    错误原因 一般原因就是路径名 的大小写没有统一 因为 windows 下 路径不区分大小写 但是 其他系统 可能就区分了 那么就会报错了 错误现象 There are multiple modules with names that onl
  • java bean的引用_JavaBean的详细及引用

    1 JavaBean实际是具有统一接口格式的java类 2 JavaBean的组成 属性 Properties 方法 Method 事件 Events 3 一个JavaBean的例子 该例子是用的Simple属性 我遵循的习惯是类名大写 包
  • 测牛学堂:软件测试要掌握的sql之命令行必会知识总结(5)

    删除数据库表的操作 drop table if exists xxx 表示当xxx表存在的时候才会执行删除操作 drop table students drop table if exists students 表中插入数据的操作 1 全部
  • Linux多线程编程初探

    Linux线程介绍 进程与线程 典型的UNIX Linux进程可以看成只有一个控制线程 一个进程在同一时刻只做一件事情 有了多个控制线程后 在程序设计时可以把进程设计成在同一时刻做不止一件事 每个线程各自处理独立的任务 进程是程序执行时的一
  • SpringBoot原理概述

    文章目录 一 SpringBoot概述 二 运行原理剖析 1 核心运行原理 Pom xml 主启动类 2 构造流程分析 3 运行流程分析 三 配置与使用 1 配置文件 2 自动配置原理 四 趣味练习 自定义starter 一 SpringB
  • SQL 列转行

    https blog csdn net vipxiaotian article details 4409423 普通行列转换 爱新觉罗 毓华 2007 11 18于海南三亚 假设有张学生成绩表 tb 如下 Name Subject Resu
  • std::set 的删元素 c++

    程序演示std set的删除操作 set类模板中 它和vector list不同 set map都是关联式容易 set 内部是基于红黑树实现的 插入和删除操作效率比较高 下面测试一下怎么删除set的里面的元素 include
  • 台资企业管理职的中英文称谓以及级别

    台资企业管理职的中英文称谓以及级别 从低到高 组长 team leader 课长 supervisor 专理 assistant manager 也就是经理助理 经理 manager 资深经理 senior manager 即我们说的高级经
  • UVA-215 电子表格计算器 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 题目并不难 数据量也不大 一次数据最多是20 10是200个 因此即使最长的嵌套引用关系 也只有200层 我们使用暴力 循环200
  • 【ubuntu】ubuntu添加或删除用户

    文章目录 1 创建新用户 2 为新用户填加超级用户权限 方法一 填加新用户到sudo group 方法二 在 etc sudoers中指定用户的权限 3 删除用户 创建新用户的意义不再多述 最直观的就是多个人用同一台机器 要为每个人创建一个
  • tomcat自动加载改变的class文件,且无需重启

    不重启Tomcat有两种方式 热部署 热加载 热部署 容器在运行时重新部署整个项目 这类环境下 一般整个内存会被清空 重新加载 这类方式有可能造成sessin丢失等问题 tomcat 6以上已解决该问题 热加载 最好是在调试过程中使用 以免
  • Caffe源码:math_functions 解析

    目录 目录 主要函数 caffe cpu gemm 函数 caffe cpu gemv 函数 caffe axpy 函数 caffe set 函数 caffe add scalar 函数 caffe copy 函数 caffe scal 函
  • 基于ChatGPT-API实现聊天机器人服务

    1 背景 要基于GPT自己去实现一个聊天机器人服务功能实现上其实特别简单 将上游服务过来的请求转换为GPT接口请求发出去然后直接返回或者回调给上游服务即可 但是其中的一些其他问题不知道大家有没有考虑过 1 搞成一个大同步的实现 当并发真的上
  • 集合方法的代码

    创建一个集合 获取从 某一索引开始到某一索引的前一位结束的代码 class b public static void main String args List
  • GO语言学习-变量2和常量与iota枚举

    变量进阶 1 多重赋值 从左至右依次匹配 如果有不需要的数据用匿名变量处理 2 匿名变量 下划线 丢弃数据不处理 匿名变量主要用于配合函数返回值使用 注 go语言的函数返回值可以有多个 使用匿名变量可以舍去不需要的返回值 package m
  • 下载安装Android Studio教程

    步骤1 下载Android Studio 访问Android Studio官方网站 https developer android com studio 点击 下载Android Studio 按钮 选择适用于您操作系统的版本 然后下载安装
  • Unix Shell 范例精解——awk课后题

    题目数据如下 Mike Harrington 510 548 1278 250 100 175 Christian Dobbins 408 538 2358 155 90 201 Susan Dalsass 206 654 6279 250
  • Three.js 基础- 第 2 章 - 几何体BufferGeometry

    Three js 基础 第 2 章 几何体BufferGeometry Three js教程 几何体BufferGeometry 在Three js中 几何体是3D对象的基本形状 本教程将介绍如何使用缓冲类型几何体BufferGeometr