13. Threejs案例-绘制3D文字
13. Threejs案例-绘制3D文字
实现效果

知识点
FontLoader
一个用于加载 JSON 格式的字体的类。
返回 font,返回值是表示字体的 Shape 类型的数组。
其内部使用 FileLoader 来加载文件。
构造器
FontLoader( manager : LoadingManager )
| 参数 | 类型 | 描述 |
|---|---|---|
| manager | LoadingManager | 加载器所使用的loadingManager,默认值为THREE.DefaultLoadingManager。 |
方法
load ( url : String, onLoad : Function, onProgress : Function, onError : Function ) : undefined
| 参数 | 类型 | 描述 |
|---|---|---|
| url | String | 文件的URL或者路径,也可以为 Data URI。 |
| onLoad | Function | 将在加载完成时调用。参数是将要被加载的font。 |
| onProgress | Function | 将在加载过程中调用。参数是包含total和loaded字节的XMLHttpRequest实例。 |
| onError | Function | 将在加载错误时调用。 |
TextGeometry (文本缓冲几何体)
一个用于将文本生成为单一的几何体的类。
它是由一串给定的文本,以及由加载的 font (字体) 和该几何体 ExtrudeGeometry 父类中的设置所组成的参数来构造的。
构造器
TextGeometry(text : String, parameters : Object)
| 参数 | 类型 | 描述 |
|---|---|---|
| text | String | 将要显示的文本。 |
| parameters | Object | 参数对象。 |
parameters 包含有下列参数的对象:
| 参数 | 类型 | 描述 |
|---|---|---|
| font | Font | THREE.Font的实例。 |
| size | Float | 字体大小,默认值为100。 |
| height | Float | 挤出文本的厚度,默认值为50。 |
| curveSegments | Integer | 曲线上点的数量,默认值为12。 |
| bevelEnabled | Boolean | 是否开启斜角,默认为false。 |
| bevelThickness | Boolean | 文本上斜角的深度,默认值为20。 |
| bevelSize | Float | 斜角与原始文本轮廓之间的延伸距离,默认值为8。 |
| bevelSegments | Integer | 斜角的分段数,默认值为3。 |
属性
boundingBox : Box3
当前 bufferGeometry 的外边界矩形。
可以通过 .computeBoundingBox() 计算。
默认值是 null。
方法
computeBoundingBox () : undefined
计算当前几何体的的边界矩形,该操作会更新已有 param:.boundingBox。
边界矩形不会默认计算,需要调用该接口指定计算边界矩形,否则保持默认值 null。
setAttribute ( name : String, attribute : BufferAttribute ) : this
为当前几何体设置一个 attribute 属性。
在类的内部,有一个存储 attributes 的 hashmap,通过该 hashmap,遍历 attributes 的速度会更快。
而使用该方法,可以向 hashmap 内部增加 attribute。
所以,你需要使用该方法来添加 attributes。
addGroup ( start : Integer, count : Integer, materialIndex : Integer ) : undefined
为当前几何体增加一个 group,详见 groups 属性。
applyMatrix4 ( matrix : Matrix4 ) : this
用给定矩阵转换几何体的顶点坐标。
center () : this
根据边界矩形将几何体居中。
clone () : BufferGeometry
克隆当前的 BufferGeometry。
copy ( bufferGeometry : BufferGeometry ) : this
将参数指定的 BufferGeometry 的值拷贝到当前 BufferGeometry 中。
clearGroups () : undefined
清空所有的 groups。
computeBoundingSphere () : undefined
计算当前几何体的的边界球形,该操作会更新已有 param:.boundingSphere。
边界球形不会默认计算,需要调用该接口指定计算边界球形,否则保持默认值 null。
computeTangents () : undefined
计算并向此 geometry 中添加 tangent attribute。
只支持索引化的几何体对象,并且必须拥有 position(位置),normal(法向)和 uv attributes。
如果使用了切线空间法向贴图,最好使用 BufferGeometryUtils.computeMikkTSpaceTangents 中的 MikkTSpace 算法。
computeVertexNormals () : undefined
通过面片法向量的平均值计算每个顶点的法向量。
dispose () : undefined
从内存中销毁对象。
如果在运行是需要从内存中删除 BufferGeometry,则需要调用该函数。
getAttribute ( name : String ) : BufferAttribute
返回指定名称的 attribute。
getIndex () : BufferAttribute
返回缓存相关的 index。
hasAttribute ( name : String ) : Boolean
检查是否存在有指定名称的 attribute,如果有返回 true。
lookAt ( vector : Vector3 ) : this
旋转几何体朝向控件中的一点。
该过程通常在一次处理中完成,不会循环处理。
典型的用法是过通过调用 Object3D.lookAt 实时改变 mesh 朝向。
normalizeNormals () : undefined
几何体中的每个法向量长度将会为 1。
这样操作会更正光线在表面的效果。
deleteAttribute ( name : String ) : BufferAttribute
删除具有指定名称的 attribute。
rotateX ( radians : Float ) : this
在 X 轴上旋转几何体。
该操作一般在一次处理中完成,不会循环处理。
典型的用法是通过调用 Object3D.rotation 实时旋转几何体。
rotateY ( radians : Float ) : this
在 Y 轴上旋转几何体。
该操作一般在一次处理中完成,不会循环处理。
典型的用法是通过调用 Object3D.rotation 实时旋转几何体。
rotateZ ( radians : Float ) : this
在 Z 轴上旋转几何体。
该操作一般在一次处理中完成,不会循环处理。
典型的用法是通过调用 Object3D.rotation 实时旋转几何体。
scale ( x : Float, y : Float, z : Float ) : this
缩放几何体。
该操作一般在一次处理中完成,不会循环处理。
典型的用法是通过调用 Object3D.scale 实时缩放几何体。
setIndex ( index : BufferAttribute ) : this
设置缓存的 index。
setDrawRange ( start : Integer, count : Integer ) : undefined
设置缓存的 drawRange。
setFromPoints ( points : Array ) : this
通过点队列设置该 BufferGeometry 的 attribute。
toJSON () : Object
返回代表该 BufferGeometry 的 JSON 对象。
toNonIndexed () : BufferGeometry
返回已索引的 BufferGeometry 的非索引版本。
translate ( x : Float, y : Float, z : Float ) : this
移动几何体。
该操作一般在一次处理中完成,不会循环处理。
典型的用法是通过调用 Object3D.translate 实时移动几何体。
代码
<!DOCTYPE html>
<html lang="zh">
<head><title></title><meta charset="UTF-8"><script src="ThreeJS/three.js"></script><script src="ThreeJS/jquery.js"></script></head>
<body>
<div id="myContainer"></div>
<script type="text/javascript">// 创建一个WebGL渲染器实例,并开启抗锯齿处理 const myRenderer = new THREE.WebGLRenderer({antialias: true});// 设置渲染器的大小为窗口的宽度和高度 myRenderer.setSize(window.innerWidth, window.innerHeight);// 将渲染器的DOM元素 (即canvas元素) 添加到ID为"myContainer"的HTML元素中 $("#myContainer").append(myRenderer.domElement);// 创建一个新的Three.js场景 const myScene = new THREE.Scene();// 设置场景的背景颜色为白色 myScene.background = new THREE.Color('white');// 创建一个透视相机,设置其视野角度、长宽比、近裁剪面和远裁剪面 const myCamera = new THREE.PerspectiveCamera(45,window.innerWidth / window.innerHeight, 0.1, 1000);// 设置相机的初始位置 myCamera.position.set(0, 40, 700);// 将相机添加到场景中,使其成为场景的一部分 myScene.add(myCamera);// 加载字库并绘制字母 const myFontLoader = new THREE.FontLoader();myFontLoader.load('Data/optimer_bold.typeface.json', function (font) {// 使用加载的字库创建几何体 (这里是字母"three.js") const myGeometry = new THREE.TextGeometry('three.js', {font: font, size: 160});// 计算当前几何体的范围 (边界框) myGeometry.computeBoundingBox();// 计算字母 (几何体) 当前中心的偏移量,以确保字母位于其边界框的中心位置 const myOffsetX = (myGeometry.boundingBox.max.x - myGeometry.boundingBox.min.x) / 2;const myOffsetY = (myGeometry.boundingBox.max.y - myGeometry.boundingBox.min.y) / 2;// 创建一个基本材质,设置其颜色为蓝色 (0x0000ff是蓝色的十六进制代码) const myMaterial = new THREE.MeshBasicMaterial({color: 0x0000ff});// 使用几何体和材质创建一个新的网格 (Mesh) 对象,即字母模型 (这里是字母"three.js") const myTextMesh = new THREE.Mesh(myGeometry, myMaterial);// 设置字母模型的位置,使其位于其几何体的中心点 (即边界框的中心) myTextMesh.position.x = myGeometry.boundingBox.min.x - myOffsetX;myTextMesh.position.y = myGeometry.boundingBox.min.y + myOffsetY;// 将字母模型添加到场景中,使其显示在屏幕上 myScene.add(myTextMesh);});//渲染绘制的字母animate();function animate() {requestAnimationFrame(animate);myCamera.lookAt(new THREE.Vector3(0, 150, 0));myRenderer.render(myScene, myCamera);}
</script>
</body>
</html>
演示链接
示例链接
相关文章:
13. Threejs案例-绘制3D文字
13. Threejs案例-绘制3D文字 实现效果 知识点 FontLoader 一个用于加载 JSON 格式的字体的类。 返回 font,返回值是表示字体的 Shape 类型的数组。 其内部使用 FileLoader 来加载文件。 构造器 FontLoader( manager : LoadingManager ) 参数类型描述managerLo…...
clickhouse清理日志。
参考Clickhouse:日志表占用大量磁盘空间怎么办?_clickhouse store目录很大-CSDN博客t 清理脚本如下,清理动作需要时间比较长,10多分钟: alter table system.trace_log delete where event_date < 2024-01-01 alt…...
JS中实现继承
1.使用call实现继承(不推荐) function Animal(name) {this.name name;this.run function() {console.log(this.name, "跑");} } function Dog(name) {// 继承Animal.call(this, name);this.sleep function() {console.log(this.name, &quo…...
spring boot学习第九篇:操作mongo的集合和集合中的数据
1、安装好了Mongodb 参考:ubuntu安装mongod、配置用户访问、添删改查-CSDN博客 2、pom.xml文件内容如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns…...
momentJs推导日历组件
实现效果: 代码: 引入momentjs然后封装两个函数构建出基本数据结构 import moment from moment;// 某月有多少天 export const getEndDay (m) > m.daysInMonth();/*** description 获取本月空值数据* param { Date } year { } 年度* param { Number } month …...
Linux C/C++ 原始套接字:打造链路层ping实现
在C/C中,我们可以使用socket函数来创建套接字。我们需要指定地址族为AF_PACKET,协议为htons(ETH_P_ALL)来捕获所有传入和传出的数据包。 可以使用sendto和recvfrom函数来发送和接收数据包。我们需要构建一个合法的链路层数据包,在数据包的头…...
TCP 粘包/拆包
文章目录 概述粘包拆包发生场景解决TCP粘包和拆包问题的常见方法Netty对粘包和拆包问题的处理小结 概述 TCP的粘包和拆包问题往往出现在基于TCP协议的通讯中,比如RPC框架、Netty等 TCP 粘包/拆包 就是你基于 TCP 发送数据的时候,出现了多个字符串“粘”…...
【Spring Boot 3】应用启动执行特定逻辑
【Spring Boot 3】应用启动执行特定逻辑 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…...
设计模式(行为型模式)观察者模式
目录 一、简介二、观察者模式2.1、事件接口及其实现2.2、观察者接口及其实现2.3、主题接口及其实现2.4、使用 三、优点与缺点 一、简介 观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,当一个对象…...
Windows 版Oracle 数据库(安装)详细过程
首先到官网上去下载oracle64位的安装程序 第一步:将两个datebase文件夹解压到同一目录中。 当下载完成后,它里面是两个文件夹 win64_11gR2_database_1of2, win64_11gR2_database_2of2,我们需要把其中的一个database文件夹整合在一起(复制一个database文件夹到另一…...
编程实例分享,计费系统一定要安装灯光控制吗?佳易王计时计费管理系统软件V18.0教程说明
编程实例分享,计费系统一定要安装灯光控制吗?佳易王计时计费管理系统软件V18.0教程说明 一、前言 以下教程以 佳易王计时计费软件V18.0为例说明 1、该软件既可以接灯控,也可以不接灯控,如果接灯控,则点击开始计时的时…...
【webpack】优化提升
webpack优化提升 安装webpack相关内容向下兼容游览器-babel/polyfill进一步优化babel/polyfill模块联邦-共享模块如何提升构建性能通用环境下1,webpack更新到最新版本2,将loader应用于最少数量的必要模块3,引导(每个额外的loader/…...
视频无损放大修复工具Topaz Video AI 新手入门教程
想要自学Topaz Video AI ?Topaz Video AI 如何使用?这里给大家带来了视频无损放大修复工具Topaz Video AI 新手入门教程,快来看看吧! 下载:Topaz Video AI for mac 导入您的文件 有两种方法可以将文件导入 Topaz Vid…...
《向量数据库指南》——Milvus Cloud 「部署」:简化部署一直在路上
“docker-compose 能部署分布式吗?”"单机部署为什么还依赖这么多组件?"“大家 Milvus Cloud 集群部署有没有实践过比较好的方案?” 作为一个开源数据库,是否能够进行快速部署,是所有工作的前提。在简化部署的道路上,社区从来没有停止过脚步。2023 年,社区推…...
使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计
1,大模型本地部署 视频说明地址: https://www.bilibili.com/video/BV1BF4m1u769/ 【创新思考】(1):使用x86架构Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,语音交互机…...
关于RabbitMQ面试题汇总
什么是消息队列?消息队列有什么用? 消息队列是一种在应用程序之间传递消息的通信机制。它是一种典型的生产者-消费者模型,其中生产者负责生成消息并将其发送到队列中,而消费者则从队列中获取消息并进行处理。消息队列的主要目的是…...
GoogleTest 单元测试
假设我们有两个函数 complexFunction 和 helperFunction,其中 complexFunction 调用了 helperFunction。我们将编写测试 complexFunction 的单元测试,并在调用 helperFunction 的地方打桩。 // 复杂函数示例 int helperFunction(int x) {return x * 2; …...
Mac利用brew安装mysql并设置初始密码
前言 之前一直是在windows上开发后段程序,所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙,我佛了,写完当天网上发…...
R语言入门笔记2.2
ifelse语句 结构:ifelse(条件,表达式1,表达式2) #满足条件,则进入表达式1,否则为表达式2 例1: > a1 > ifelse(a<0,"a小于0",ifelse(a0,0,"a大于0")) [1] "a大于0"a1 - 这行代码给变量a…...
一般系统的请求认证授权思路【gateway网关+jwt+redis+请求头httpheader】
gateway:网关,我们都知道网关的作用就是对系统的所有请求,网关都会进行拦截,然后做一些操作(例如:设置每个请求的请求头httpHeader,身份认证等等)此时一般会使用到网关过滤器&#x…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
