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…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...