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…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
