学习使用几何体
在前几章中,您学到了许多关于如何使用 Three.js 的知识。
现在您已经知道如何创建基本场景、添加光照并配置网格的材质。
在第2章《Three.js场景的基本组件》中,
我们简要涉及了(但并未深入讨论)Three.js提供的几何体的详细信息,
您可以使用这些几何体来创建您的3D对象。
在本章和第6章《探索高级几何体》中,
我们将为您介绍 Three.js 提供的所有开箱即用的几何体(除了我们在第4章《使用Three.js材质》中讨论的 THREE.Line)。
在本章中,我们将研究以下几何体:
THREE.CircleGeometryTHREE.RingGeometryTHREE.PlaneGeometryTHREE.ShapeGeometryTHREE.BoxGeometryTHREE.SphereGeometryTHREE.CylinderGeometryTHREE.ConeGeometryTHREE.TorusGeometryTHREE.TorusKnotGeometryTHREE.PolyhedronGeometryTHREE.IcosahedronGeometryTHREE.OctahedronGeometryTHREE.TetrahedronGeometryTHREE.DodecahedronGeometry
在深入研究 Three.js 提供的几何体之前,
我们首先将更深入地了解 Three.js 如何将几何体内部表示为 THREE.BufferGeometry。
在一些文档中,您可能仍会遇到 THREE.Geometry 作为所有几何体的基础对象。
在更新的版本中,这已经完全被 THREE.BufferGeometry 取代,后者通常具有更好的性能,
因为它可以轻松地将数据传输到 GPU。
然而,与旧的 THREE.Geometry 相比,使用起来稍微有些困难。
使用 THREE.BufferGeometry,几何体的所有属性都由一组属性标识。属性基本上是一个带有一些附加元数据的数组,其中包含有关顶点位置的信息。属性还用于存储有关顶点的其他信息,例如颜色。要使用属性定义顶点和面,您可以使用 THREE.BufferGeometry 的以下两个属性:
attributes:attributes属性用于存储可以直接传递给 GPU 的信息。 例如,为了定义一个形状,您可以定义一个Float32Array,其中每三个值定义一个顶点。 然后可以在THREE.BufferGeometry中这样定义:geometry.setAttribute('position', new THREE.BufferAttribute(arrayOfVertices, 3));。index:默认情况下,不需要显式定义面(每三个连续的位置被解释为一个单独的面), 但使用index属性, 我们可以显式定义哪些顶点一起形成一个面:geometry.setIndex(indicesArray);。
在本章中,使用这些内部属性创建几何体时,您无需考虑这些内部属性, 因为当构造几何体时,Three.js 会正确设置它们。 然而,如果您想从头开 始创建几何体,那么您需要使用前面列表中显示的属性。
在 Three.js 中,我们有一些几何体会产生 2D 网格,以及更多会创建 3D 网格的几何体。 在本章中,我们将讨论以下主题:
- 2D 几何体
- 3D 几何体
2D 几何体
2D 对象看起来像是平面对象,并且顾名思义,只有两个维度。
在本节中,我们将首先看一下 2D 几何体:
THREE.CircleGeometry、
THREE.RingGeometry、
THREE.PlaneGeometry 和
THREE.ShapeGeometry。
THREE.PlaneGeometry
THREE.PlaneGeometry 对象可用于创建一个非常简单的 2D 矩形。
要查看此几何体的示例,请查看本章节源代码中的 plane-geometry.html 示例。
以下截图显示了使用 THREE.PlaneGeometry 创建的矩形:
在本章的示例中,我们添加了一个控制 GUI,您可以使用它来控制几何体的属性(在本例中为宽度、高度、宽度分段数和高度分段数),还可以更改材质(及其属性)、禁用阴影并隐藏地平面。例如,如果要查看此形状的各个面,可以通过禁用地平面并启用所选材质的 wireframe 属性来轻松显示它们:
创建 THREE.PlaneGeometry 对象非常简单,如下所示:
new THREE.PlaneGeometry(width, height, widthSegments, heightSegments)
在 THREE.PlaneGeometry 的这个 示例中,
您可以更改这些属性并直接看到其对生成的 3D 对象的影响。
下面是这些属性的解释:
width:矩形的宽度。height:矩形的高度。widthSegments:应将宽度划分为的段数。默认为1。heightSegments:应将高度划分为的段数。默认为1。
如您所见,这不是一个非常复杂的几何体。您只需指定大小,就完成了。
如果要创建更多的面(例如,当您想创建棋盘图案时),可以使用 widthSegments 和 heightSegments 属性将几何体划分为较小的面。
如果要在创建后访问几何体的属性,不能简单地说 plane.width。
要访问几何体的属性,必须使用对象的 parameters 属性。
因此,要获取本节中创建的 plane 对象的宽度属性,
您需要使用 plane.parameters.width。