ThreeJS —— 机房Demo(三)

本文介绍如何在ThreeJS中创建3D文字和精灵文字Sprite,包括创建带弧角的Sprite以及利用ExtrudeGeometry和Tween.js实现光圈的渐变动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一节我们重构了我们的代码,形成了两个区域,绘制出了一个大致的场景,这一节我们将在此基础上再添加一些实用的场景

目录结构

├── font // 字体文件
 |├──── font.ttf // 字体源文件
 |└──── font.json // 转换后的字体文件
├── img // 素材图片
 |├──── xx.png
 |├──── xxx.jpg
 |└──── …
├── js // 自己编写的js文件
 |├──── composer_fn.js // 后期处理
 |├──── create_fn.js // 创建各种几何
 |├──── init_fn.js // 初始化项目
 |└──── util_fn.js // 工具函数
├── lib // 需要引入的js文件
 |├──── three.js
 |├──── OrbitControls.js
 |├──── RenderPass.js
 |└──── …
├── model // 建模工具导出的模型
 |├──── computer.gltf
 |└──── …
└── index.html // 入口文件

创建文字

一个场景中一定少不了文字说明,用来描述该区域的特点、情况

创建3D文字

// create_fn.js
function createText(text, color, conf) {
   
  // 为了解决回调地狱,同样引入Promise
  return new Promise((res) => {
   
    new THREE.FontLoader().load("../font/simhei.json", function (font) {
   
      const geometry = new THREE.TextBufferGeometry(text, {
   
        font,
        size: 3,
        height: 1,
        curveSegments: 64,
      });
      geometry.center(); // 将文字居中
      const material = new THREE.MeshBasicMaterial({
   
        color,
      });
      const mesh = new THREE.Mesh(geometry, material);
      initConfig(mesh, conf);
      res(mesh);
    });
  });
}

// index.html
// 引用
const text = await createText("移动网络接入区", "rgb(216, 120, 133)", {
   
  position: {
    x: 39, y: -3, z: 22 },
});

效果图:
3D文字

创建精灵文字Sprite

有的时候我们需要创建一个始终面向我们的一个平面,这个时候就要用的精灵几何体Sprite,精灵是一个总是面朝着摄像机的平面

效果图:
精灵文字
要创建一个Sprite几何体,必须传入SpriteMaMterial精灵材质,而该材质支持贴图,所以我们通常用图片或画布贴图实现Sprite,不过为了更自由的配置Sprite的内容(用图片太不方便,不同的Sprite还需要制作不同的图片),我们这里采用画布贴图CanvasTexture,并用到了一个DOM转canvas的插件html2canvas

// create_fn.js
// 创建永远朝向自己这一面的文字
async function createSpriteText(selcetor, conf) {
   
  const elem = document.querySelector(selcetor); // selector是传入的选择器
  const canvas = await html2canvas(elem, {
   
    // 加入x、y配置,防止画布偏移,不加这两个配置,画布有可能偏移,产生空白区域
    x: elem.offsetLeft, 
    y: elem.offsetTop,
  });
  const texture = new THREE.CanvasTexture(canvas); 
  texture.magFilter = THREE.NearestFilter; // 提高清晰度,不加这两句画布会变模糊
  texture.minFilter = THREE.NearestFilter;
  const spriteMaterial = new THREE.SpriteMaMterial({
   
    map: texture,
    opacity: 0.8,
  }); // 创建精灵材质,map属性设置贴图,为了更高的可配置度,我们选择用canvas贴图
  const sprite = new THREE.Sprite(spriteMaterial); // 要创建精灵几何体必须要用精灵材质
  initConfig(sprite, conf);
  return sprite;
}

在入口文件index.html中使用createSpriteText

<!DOCTYPE html>
<html>
  <head>
  	<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link
      rel
在Vue项目中使用Three.js展示机房,你可以按照以下方式组织你的文件结构: 在src目录下创建一个components文件夹,用于存放Vue组件。在该文件夹下可以创建一个Room.vue组件,用于展示机房的2D和3D效果。 在src/assets目录下可以存放一些静态资源,比如图片和字体文件。 在src/js目录下可以存放自己编写的JavaScript文件,例如common.js用于定义全局变量,create.js用于创建各种几何体物体,util.js用于存放工具函数等。 在src/lib目录下可以存放一些需要引入的第方库文件,如three.js和OrbitControls.js等。 在src/model目录下可以存放建模工具导出的模型文件,比如computer.gltf等。 在src/composer目录下可以放一些后期处理相关的文件。 在src/group目录下可以存放分组相关的文件,例如groupCommon.js用于存放分组间公用的内容,normalSceneGroup.js用于存放分组一的内容,sceneGroup1.js用于存放分组二的内容,sceneGroup2.js用于存放分组的内容。 最后,你可以在src/main.js文件中进行入口文件的配置,将所需的组件引入并渲染到页面中。 这样的文件结构可以使你更好地组织代码和资源,方便进行开发和维护。当然,根据实际情况,你也可以适当调整文件结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ThreeJS —— 机房Demo(五)](https://blog.youkuaiyun.com/weixin_41998030/article/details/106621732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [vue项目用three.js机房展示](https://blog.youkuaiyun.com/weixin_45714257/article/details/122865112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值