13. Threejs案例-绘制3D文字

news2024/11/25 22:54:15

13. Threejs案例-绘制3D文字

实现效果

效果

知识点

FontLoader

一个用于加载 JSON 格式的字体的类。
返回 font,返回值是表示字体的 Shape 类型的数组。
其内部使用 FileLoader 来加载文件。

构造器

FontLoader( manager : LoadingManager )

参数类型描述
managerLoadingManager加载器所使用的loadingManager,默认值为THREE.DefaultLoadingManager。
方法
load ( url : String, onLoad : Function, onProgress : Function, onError : Function ) : undefined
参数类型描述
urlString文件的URL或者路径,也可以为 Data URI。
onLoadFunction将在加载完成时调用。参数是将要被加载的font。
onProgressFunction将在加载过程中调用。参数是包含total和loaded字节的XMLHttpRequest实例。
onErrorFunction将在加载错误时调用。

TextGeometry (文本缓冲几何体)

一个用于将文本生成为单一的几何体的类。
它是由一串给定的文本,以及由加载的 font (字体) 和该几何体 ExtrudeGeometry 父类中的设置所组成的参数来构造的。

构造器

TextGeometry(text : String, parameters : Object)

参数类型描述
textString将要显示的文本。
parametersObject参数对象。

parameters 包含有下列参数的对象:

参数类型描述
fontFontTHREE.Font的实例。
sizeFloat字体大小,默认值为100。
heightFloat挤出文本的厚度,默认值为50。
curveSegmentsInteger曲线上点的数量,默认值为12。
bevelEnabledBoolean是否开启斜角,默认为false。
bevelThicknessBoolean文本上斜角的深度,默认值为20。
bevelSizeFloat斜角与原始文本轮廓之间的延伸距离,默认值为8。
bevelSegmentsInteger斜角的分段数,默认值为3。
属性
boundingBox : Box3

当前 bufferGeometry 的外边界矩形。
可以通过 .computeBoundingBox() 计算。
默认值是 null

方法
computeBoundingBox () : undefined

计算当前几何体的的边界矩形,该操作会更新已有 param:.boundingBox
边界矩形不会默认计算,需要调用该接口指定计算边界矩形,否则保持默认值 null

setAttribute ( name : String, attribute : BufferAttribute ) : this

为当前几何体设置一个 attribute 属性。
在类的内部,有一个存储 attributeshashmap,通过该 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

通过点队列设置该 BufferGeometryattribute

toJSON () : Object

返回代表该 BufferGeometryJSON 对象。

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>

演示链接

示例链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1433591.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始手写mmo游戏从框架到爆炸(二)— 核心组件抽离与工厂模式创建

上一章我们已经完成了一个基本netty的通信&#xff0c;但是netty的启动很多代码都是重复的&#xff0c;所以我们使用工厂模式来生成不同的ServerBootstrap。 首先创建一个新的组件core组件&#xff0c;和common组件&#xff0c;主要用于netty通信和工具类&#xff0c;从server…

day31 JS执行机制

目录 前言同步和异步JS执行机制 前言 JavaScript语言的一大特点是单线程。 JavaScript是为处理页面中用户的交互&#xff0c;以及操作DOM而诞生的。比如对某个DOM元素进行添加和删除操作&#xff0c;不能同时进行&#xff0c;应该先进行添加再继续删除。 示例&#xff08;解…

服务器性能监控管理方法及工具

服务器是组织数据中心的主干&#xff0c;无论是优化的用户体验&#xff0c;还是管理良好的资源&#xff0c;服务器都能为您完成所有工作&#xff0c;保持服务器随时可用和可访问对于面向业务的应用程序和服务以最佳水平运行至关重要。 理想的服务器性能需要主动监控物理和虚拟…

为电子表格嵌入数据库,Excel/WPS一键升级为管理系统

将Excel表格转化为管理系统&#xff0c;这款工具能够实现只需导入表格数据&#xff0c;即可自动生成相应的软件和APP。 表格办公的烦恼&#xff0c;有遇到吧&#xff1f; 对于具有一定规模的企业而言&#xff0c;各类表格如同繁星般众多&#xff0c;既有日常使用的常规表格&a…

力扣刷题之旅:进阶篇(一)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 题目1&#xff1a;三数之和 题目描述&#xff1a; 给定一个包含n个…

轻型民用无人机驾驶航空器安全操控——理论考试多旋翼部分笔记

今天已经可以在线考取轻型民用无人机驾驶航空器执照了&#xff0c;所以我也在在线观看完视频之后整理了如下的知识点&#xff0c;所有知识点全部来自UOM平台。 目录 航空器知识 &#xff08;1&#xff09;多旋翼民用无人驾驶航空器螺旋桨的作用 &#xff08;2&#x…

[office] Excel表格中的日期怎么快速标注双休日- #经验分享#职场发展#职场发展

Excel表格中的日期怎么快速标注双休日? Excel表格中的日期怎么快速标注双休日&#xff1f;excel表格中的数据想要标注出双休日&#xff0c;该怎么给双休日填充黄色背景呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 excel表格中的数据&#xff…

ReactNative实现的横向滑动条

OK&#xff0c;我们先看下效果图 注意使用到了两个库 1.react-native-linear-gradient 2.react-native-gesture-handler ok&#xff0c;我们看下面的代码 import {Image, TouchableWithoutFeedback, StyleSheet, View} from react-native; import LinearGradient from reac…

[linux] kolla-ansible 部署的openstack 修改mariadb默认端口号

kolla-ansible 部署前修改global.yml #freezer_database_backend: "mariadb" database_port: 9306 mariadb_port: 9306如果已经部署成功&#xff0c;直接修改配置文件里的端口号重启是没有用的&#xff0c;怀疑内部做了缓存&#xff0c;查看openstack 使用的memcach…

Abap与eCharts

一&#xff0c;简介 利用html与eCharts来绘图&#xff0c;然后用cl_gui_html_viewer将html呈现到abap屏幕中。 二&#xff0c;使用eCharts画图 在一个文件夹中准备如下文件&#xff0c;index.html和echarts.js是必须的&#xff0c;data.json(作为数据源)和jquery.js如果用到就可…

windows安装Visual Studio Code,配置C/C++运行环境(亲测可行)

一.下载 Visual Studio Code https://code.visualstudio.com/ 二.安装 选择想要安装的位置: 后面的点击下一步即可。 三.下载编译器MinGW vscode只是写代码的工具&#xff0c;使用编译器才能编译写的C/C程序&#xff0c;将它转为可执行文件。 MinGW下载链接&#xff1a;…

【节选】Go语言的100个错误使用场景|数据类型

Data types &#x1f31f; 章节概述&#xff1a; 基本类型涉及的常见错误 掌握 slice 和 map 的基本概念&#xff0c;避免使用时产生 bug 值的比较 低效的切片初始化&#xff08;#21&#xff09; 实现一个 conver 方法&#xff0c;将一个切片 Foo 转换成另一个类型的切片 Ba…

在线视频格式转换,就是这么简单!(免费)

随着数字化时代的发展&#xff0c;我们在日常生活中越来越频繁地与各种视频文件打交道。然而&#xff0c;不同设备和平台对于视频格式的支持可能存在差异&#xff0c;这就导致了我们有时需要进行视频格式的转换&#xff0c;以确保视频在各种环境中流畅播放。而幸运的是&#xf…

简单使用阿里云OSS对象存储

首先我们先去阿里云控制台开通oss对象存储&#xff08;阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台&#xff09; 这篇文件是借鉴至&#xff08;教你三分钟上手阿里云OOS上传操作_阿里云定时上传怎么使用-CSDN博客&#xff09;的&#xff0c;源码也给了&a…

Python代码混淆工具,Python源代码保密、加密、混

引言 Python作为一种高级脚本语言&#xff0c;便捷的语法和丰富的库使它成为众多开发者的首选。然而&#xff0c;有时候我们希望保护我们的Python源代码&#xff0c;避免被他人轻易获取和篡改。为了实现这一目标&#xff0c;我们可以采取代码混淆的技术手段。本文将介绍Python…

深度学习系列55:深度学习加速技术概述

总体有两个方向&#xff1a;模型优化 / 框架优化 1. 模型优化 1.1 量化 最常见的量化方法为线性量化&#xff0c;权重从float32量化为int8&#xff0c;将输入数据映射在[-128,127]的范围内。在 nvdia gpu&#xff0c;x86、arm 和 部分 AI 芯片平台上&#xff0c;均支持 8bit…

Vue中keep-alive的作用、原理及应用场景

在进行Vue开发的过程中&#xff0c;我们经常会遇到需要进行组件缓存的场景&#xff0c;这时候Vue提供的keep-alive组件就派上了用场。keep-alive组件是Vue内置的一个抽象组件&#xff0c;它可以将其包裹的组件进行缓存&#xff0c;提高组件的性能&#xff0c;同时也可以节省服务…

docker-学习-3

docker 学习第三天 docker 学习第三天1. 回顾一下1.1. 对比图1.2. docker和虚拟机的区别1.3. 在容器化部署中&#xff0c;为什么有些场景更适合选择Docker而非虚拟机&#xff1f;1.4. 有哪些场景适合选择虚拟机而不是Docker进行部署&#xff1f;1.5. 虚拟机和Docker在性能和资源…

Python 数据分析(PYDA)第三版(二)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 四、NumPy 基础知识&#xff1a;数组和向量化计算 原文&#xff1a;wesmckinney.com/book/numpy-basics 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版…

Java tomcat 使用spring-task,实现定时任务功能

前言 今天接触到一个需求&#xff0c;需要添加一个定时任务功能&#xff0c;第一反应是启动类EnableScheduling、定时任务方法使用Scheduled实现&#xff0c;导入项目后才发现&#xff0c;这个项目是ssm整合框架的tomcat项目&#xff0c;没有启动类&#xff0c; 于是改变了思路…