--- title: 3D 文本 description: 轻松添加3D文本 author: alvarosabu thumbnail: /recipes/text-3d.png difficulty: 1 --- # 3D 文本 [TextGeometry](https://threejs.org/docs/index.html?q=text#examples/en/geometries/TextGeometry) 是我们在场景中添加 3D 文本的一种方式。 然而,它不是 ThreeJS 内核的一部分。因此,要使用它,你需要从 `three/addons/controls/TextGeometry` 模块中导入它。 这会产生一个问题,因为 **TresJS** 会自动创建 Three 内核的目录,以便你可以将它们用作组件。 幸运的是,**TresJS** 提供了一种扩展组件目录的方法。你可以使用核心库中的 `extend` 方法来做到这一点。 有关扩展 TresJS 目录的更多信息,请参阅 [extending](/advanced/extending.md) 部分。 ## 使用 TextGeometry 要使用 `TextGeometry`,你需要从 `three/addons/geometries/TextGeometry` 模块中导入它。 ```js import { TextGeometry } from 'three/addons/geometries/TextGeometry' ``` 然后,你需要使用 `extend` 方法扩展组件目录。 ```js import { extend } from '@tresjs/core' import { TextGeometry } from 'three/addons/geometries/TextGeometry' extend({ TextGeometry }) ``` [TextGeometry](https://threejs.org/docs/index.html?q=text#examples/en/geometries/TextGeometry) 只需要一个必填参数,即字体,你可以在下面看到一个示例。 ```js const fontPath = 'https://raw.githubusercontent.com/Tresjs/assets/main/fonts/FiraCodeRegular.json' const loader = new FontLoader() const font = await new Promise((resolve, reject) => { try { loader.load(fontPath, (font) => { resolve(font) }) } catch (error) { reject(console.error('cientos', error)) } }) ``` 现在,你可以在场景中的 TresMesh 内使用 `TresTextGeometry` 组件 ```vue ``` 然后,正如示例中所示,你可以传递一个包含所需配置的对象。 ```ts const fontOptions = { size: 0.5, height: 0.2, curveSegments: 5, bevelEnabled: true, bevelThickness: 0.05, bevelSize: 0.02, bevelOffset: 0, bevelSegments: 4, } ``` 我们还可以传递一个 matcapTexture 来添加最终细节,在 TresMesh 内使用 TresMeshNormalMaterial ```ts const matcapTexture = await useTexture(['https://raw.githubusercontent.com/Tresjs/assets/main/textures/matcaps/7.png']) ``` ```html ``` 因此,最终代码如下所示: ```vue ``` 我知道这看起来工作量很大,但好消息是,还有一种更简单的方法 ## 来自 `cientos` 的 TextGeometry `cientos` 包提供了一个名为 `` 的组件,它是 [`three-stdlib`](https://github.com/pmndrs/three-stdlib) 模块中的 `TextGeometry` 的包装器。 最棒的部分?你无需扩展目录,只需传递字体参数即可。 它就能正常工作。💯(如果没有提供文本,则文本将为 TresJS) ```vue ``` 我们可以将选项作为 props 传递 ```html ``` 如果未提供选项,则默认值为: ``` size: 0.5, height: 0.2, curveSegments: 5, bevelEnabled: true, bevelThickness: 0.05, bevelSize: 0.02, bevelOffset: 0, bevelSegments: 4, ``` 默认情况下,ThreeJS 中的文本从网格初始位置开始,因此为 [0,0,0],文本将从那里开始,但我们只需传递标志“center”即可将其居中 ```vue ```