当前位置:   article > 正文

Three.js--》实现3d字体模型展示_three 做3d立体字

three 做3d立体字

目录

项目搭建

初始化three.js基础代码

设置环境纹理

加载字体模型


今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

项目搭建

本案例还是借助框架书写three项目,借用vite构建工具搭建vue项目,vite这个构建工具如果有不了解的朋友,可以参考我之前对其讲解的文章:vite脚手架的搭建与使用 。搭建完成之后,用编辑器打开该项目,在终端执行 npm i 安装一下依赖,安装完成之后终端在安装 npm i three 即可。

  1. <template>
  2. <!-- 酷炫字体 -->
  3. <Coolfonts></Coolfonts>
  4. </template>
  5. <script setup>
  6. import Coolfonts from './components/Coolfonts.vue';
  7. </script>
  8. <style lang="less">
  9. *{
  10. margin: 0;
  11. padding: 0;
  12. }
  13. </style>

初始化three.js基础代码

three.js开启必须用到的基础代码如下:

导入three库

import * as THREE from 'three'

初始化场景

const scene = new THREE.Scene()

初始化相机

  1. // 设置渲染器
  2. const renderdr = new THREE.WebGLRenderer({ antialias: true })
  3. renderdr.setSize(window.innerWidth,window.innerHeight)
  4. document.body.appendChild(renderdr.domElement)

添加控制器并监听屏幕大小的改变

  1. import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
  2. // 添加控制器
  3. const controls = new OrbitControls(camera,renderdr.domElement)
  4. controls.enableDamping = true
  5. // 监听屏幕大小的改变,修改渲染器的宽高和相机的比例
  6. window.addEventListener("resize",()=>{
  7. renderer.setSize(window.innerWidth,window.innerHeight)
  8. camera.aspect = window.innerWidth/window.innerHeight
  9. camera.updateProjectionMatrix()
  10. })

设置渲染函数

  1. // 设置渲染函数
  2. const render = () =>{
  3. controls.update()
  4. requestAnimationFrame(render)
  5. renderdr.render(scene,camera)
  6. }
  7. render()

ok,写完基础代码之后,接下来开始具体的Demo实操。

设置环境纹理

看过我之前文章的人都知道,设置环境已经老生常谈了,就是使用TextureLoader,其是Three.js中加载图片纹理的一种加载器。在 Three.js 中,画面的渲染是基于 WebGL 实现的,而图片纹理则是应用于其中的一种材质类型。使用 TextureLoader 可以方便地加载外部图片文件,例如 JPG、PNG 等格式的图片,以便将其应用到 Three.js 的材质中。

  1. // 设置环境纹理
  2. const texture = new THREE.TextureLoader().load('/images/starts.jpg')
  3. texture.mapping = THREE.EquirectangularReflectionMapping // 全景贴图反射
  4. scene.background = texture
  5. scene.environment = texture

这里为了彰显字体,我把背景设置一下模糊度属性,环境变得模糊起来:

  1. // 设置背景的模糊度
  2. scene.backgroundBlurriness = 0.2

加载字体模型

在 Three.js 中,我们可以使用 FontLoader(用于加载字体文件的工具类) 加载包含字形信息的字体文件(通常为 JSON 格式),并使用字体文件创建 TextGeometry 实例,从而在场景中显示文本。我们设置字体格式的话可以参考:官方提供的示例字体 JSON 文件

目前,Three.js 官方并没有提供官方的中文字体,但是可以使用第三方的字体库来实现中文的显示,我们可以通过搜索引擎下载该字体的 TTF 或 OTF 格式文件,并使用 Gulp 或者 Webfont 等工具将其转换为 Three.js 所需的 JSON 格式文件。这里就不再展示了,以官方提供的字体案例演示

  1. const loader = new FontLoader()
  2. loader.load('fonts/Flamingo.json',(font)=>{
  3. // 创建几何体
  4. const geometry = new TextGeometry( 'hello three.js!', {
  5. font: font, // 字体
  6. size: 80, // 字体大小
  7. height: 15, // 字体厚度
  8. curveSegments: 12, // 曲线分段数
  9. bevelEnabled: true, // 是否启用斜角
  10. bevelThickness: 10, // 斜角厚度
  11. bevelSize: 2, // 斜角大小
  12. bevelSegments: 5 // 斜角分段数
  13. });
  14. geometry.center()
  15. // 设置几何体的材质
  16. const material = new THREE.MeshPhysicalMaterial({
  17. color: 0xff0000,
  18. roughness: 0,
  19. reflectivity: 1,
  20. thickness: 80,
  21. ior: 1.5,
  22. side: THREE.DoubleSide
  23. })
  24. // 创建字体
  25. const mesh = new THREE.Mesh(geometry,material)
  26. scene.add(mesh)
  27. })

demo做完,给出本案例的完整代码:(获取素材也可以私信博主)

  1. <script setup>
  2. import * as THREE from 'three'
  3. import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
  4. // 导入字体加载器
  5. import { FontLoader } from 'three/examples/jsm/loaders/FontLoader'
  6. // 导入几何缓冲
  7. import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry'
  8. // 创建场景
  9. const scene = new THREE.Scene()
  10. // 创建相机
  11. const camera = new THREE.PerspectiveCamera(45,window.innerWidth / window.innerHeight,1,2000)
  12. camera.position.set(0,0,800)
  13. // 设置渲染器
  14. const renderdr = new THREE.WebGLRenderer({ antialias: true })
  15. renderdr.setSize(window.innerWidth,window.innerHeight)
  16. document.body.appendChild(renderdr.domElement)
  17. // 添加控制器
  18. const controls = new OrbitControls(camera,renderdr.domElement)
  19. controls.enableDamping = true
  20. // 监听屏幕大小的改变,修改渲染器的宽高和相机的比例
  21. window.addEventListener("resize",()=>{
  22. renderer.setSize(window.innerWidth,window.innerHeight)
  23. camera.aspect = window.innerWidth/window.innerHeight
  24. camera.updateProjectionMatrix()
  25. })
  26. // 设置渲染函数
  27. const render = () =>{
  28. controls.update()
  29. requestAnimationFrame(render)
  30. renderdr.render(scene,camera)
  31. }
  32. render()
  33. // 设置环境纹理
  34. const texture = new THREE.TextureLoader().load('/images/starts.jpg')
  35. texture.mapping = THREE.EquirectangularReflectionMapping // 全景贴图反射
  36. scene.background = texture
  37. scene.environment = texture
  38. // 设置背景的模糊度
  39. scene.backgroundBlurriness = 0.2
  40. // 加载字体
  41. const loader = new FontLoader()
  42. loader.load('fonts/Flamingo.json',(font)=>{
  43. // 创建几何体
  44. const geometry = new TextGeometry( 'hello three.js!', {
  45. font: font, // 字体
  46. size: 80, // 字体大小
  47. height: 15, // 字体厚度
  48. curveSegments: 12, // 曲线分段数
  49. bevelEnabled: true, // 是否启用斜角
  50. bevelThickness: 10, // 斜角厚度
  51. bevelSize: 2, // 斜角大小
  52. bevelSegments: 5 // 斜角分段数
  53. });
  54. geometry.center()
  55. // 设置几何体的材质
  56. const material = new THREE.MeshPhysicalMaterial({
  57. color: 0xff0000,
  58. roughness: 0,
  59. reflectivity: 1,
  60. thickness: 80,
  61. ior: 1.5,
  62. side: THREE.DoubleSide
  63. })
  64. // 创建字体
  65. const mesh = new THREE.Mesh(geometry,material)
  66. scene.add(mesh)
  67. })
  68. </script>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/520595
推荐阅读
相关标签
  

闽ICP备14008679号