javascript Three.js创建文字初体验

目录
  • 效果
    • 开始创建文本
      • 首先创建字体加载器
      • 加载字体库
      • 创建文字几何体
      • 计算文字几何体外边界矩形
      • 创建镜像文字
      • 创建半透明平面
    • 渲染
  • 关于文本构造器参数
    • 当curveSegments设置越低时,可以看到文字没有那么圆滑
    • 当开启了斜角时,可以观察到字体的边棱变得圆滑,不再锐利
    • 设置斜角参数
  • 完整代码
  • 总结

效果

首先引入必要组件

import './build/three.js';
import './libs/js/controls/OrbitControls.js'
import { FontLoader } from './libs/jsm/loaders/FontLoader.js';
import { TextGeometry } from './libs/jsm/geometries/TextGeometry.js';

然后不可少的初始化场景、渲染器、相机、控制器

		var renderer, scene, camera, controls
		// 初始化场景
        function initScene() {
            scene = new THREE.Scene();
            //给场景添加烟雾效果
            // 参数:烟雾颜色,烟雾范围near,烟雾范围far
            scene.fog = new THREE.Fog(0x000000, 0, 3000)
            // 给场景添加坐标轴
            var axes = new THREE.AxesHelper(100)
            scene.add(axes)
        }
        // 初始化渲染器
        function initRenderer() {
            // antialias是否开启抗锯齿
            renderer = new THREE.WebGLRenderer({ antialias: true })
            renderer.setSize(window.innerWidth, window.innerHeight)
            renderer.setClearColor(0xeeeeee)
            document.body.appendChild(renderer.domElement);
        }
        // 初始化相机
        function initCamera() {
            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
            camera.position.x = 50
            camera.position.y = 50
            camera.position.z = 50
        }
        // 初始化控制器
        function initControls() {
            controls = new THREE.OrbitControls(camera, renderer.domElement)
            controls.enableZoom = false; //是否开启缩放;
            controls.minPolarAngle = Math.PI / 2.5; //限制竖直方向上最小旋转角度 y轴正向为0度
            controls.maxPolarAngle = Math.PI / 2.5; //限制竖直方向上最大旋转角度 y轴正向为0度
        }

初始化光源

		// 初始化光源
        function initLight() {
        // 白光,光强1
            var pointLight = new THREE.PointLight(0xffffff, 1);
            pointLight.position.set(0, 100, 100);
            scene.add(pointLight);
            var pointLight = new THREE.PointLight(0xffffff, 1);
            pointLight.position.set(0, 100, -100);
            scene.add(pointLight);
        }

开始创建文本

首先创建字体加载器

var loader = new FontLoader();

加载字体库

加载字体库资源成功后会将该字体库传给回调函数

loader.load(src, callback)

字体库资源可以通过typeface.json选择自己想要的ttf字体文件将之转换为json文件,然后在回调函数中创建字体几何体

loader.load('./fonts/FZKaTong-M19S_Regular.json', function (response) {
               // 在这里面创建文字
            })

创建文字几何体

				// 创建文本缓冲几何体
                var textGeometry = new TextGeometry('狗托吴嘉豪', {
                	// 字体类型
                    font: response,
                    // 字体大小
                    size: 15,
                    // 字体的厚度
                    height: 1,
                    // 文本曲线上的点的数量,越高字体曲线越平滑
                    curveSegments: 12,
                    // 是否开启斜角(棱角平滑过渡)
                    bevelEnabled: false,
                    // 文本上斜角的深度
                    bevelThickness: 0.1,
                    // 斜角与原始文本轮廓之间的延伸距离(斜角尺寸)
                    bevelSize: 0.1,
                    // 斜角分段数
                    bevelSegments: 3
                })
				// 文字材质
                // 使用材质数组
                var textMaterial = [
                    // 第一项修饰文字正面背面
					new THREE.MeshPhongMaterial( { color: 0x00ff00, flatShading: true } ), // front
                    // 第二项修饰文字侧面(顶部底部)
					new THREE.MeshPhongMaterial( { color: 0x0000ff, flatShading: true } ) // side
                    // Phong网格材质可以模拟具有镜面高光的光泽表面(例如涂漆木材)
				]
				// 创建文字
                var text = new THREE.Mesh(textGeometry, textMaterial)

计算文字几何体外边界矩形

可以想象几何体存放于一个看不见的矩形立方体容器之中,而这个容器默认位置为原点处,沿x轴z轴正方向向外延伸,如此我们的文字便不会处于视野中心。
此时,我们可以通过计算几何体的外边界矩形,设置几何体的位置向反方向移动其长度的一半使得不论几何体变得有多长,其始终处于视野中心。

				// computeBoundingBox()计算当前几何体的的外边界矩形
				textGeometry.computeBoundingBox();
                // console.log(textGeometry.boundingBox); 查看外边界矩形顶点位置
                // 文字位置向左移动文字长度的一半
                var centerOffset = -0.5*(textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x)
                text.position.x = centerOffset
                text.position.z = 0
                scene.add(text);

创建镜像文字

				// 创建文字镜像
                var mirror = new THREE.Mesh(textGeometry, textMaterial)
                // 翻转180度
                mirror.rotation.x = Math.PI
                mirror.position.x = centerOffset
                mirror.position.y = -8
                scene.add(mirror)

创建半透明平面

				// 创建文字镜像
                var mirror = new THREE.Mesh(textGeometry, textMaterial)
                // 翻转180度
                mirror.rotation.x = Math.PI
                mirror.position.x = centerOffset
                mirror.position.y = -8
                scene.add(mirror)

渲染

		function render() {
            renderer.render(scene, camera);
            requestAnimationFrame(render)
        }
        function start() {
            initRenderer()
            initScene();
            initCamera();
            initControls()
            initLight()
            initText()
            render()
        }
        start()

关于文本构造器参数

当curveSegments设置越低时,可以看到文字没有那么圆滑

// 文本曲线上的点的数量,越高曲线越平滑
curveSegments: 1,

当开启了斜角时,可以观察到字体的边棱变得圆滑,不再锐利

// 是否开启斜角(棱角平滑过渡)
bevelEnabled: true,

设置斜角参数

// 文本上斜角的深度
bevelThickness: 0.1,
// 斜角与原始文本轮廓之间的延伸距离(斜角尺寸)
bevelSize: .1,
// 斜角分段数
bevelSegments: 3

完整代码

<script type="module">
        import './build/three.js';
        import './libs/js/controls/OrbitControls.js'
        import { FontLoader } from './libs/jsm/loaders/FontLoader.js';
        import { TextGeometry } from './libs/jsm/geometries/TextGeometry.js';
        var renderer, scene, camera, controls
        // 初始化渲染器
        function initRenderer() {
            // antialias是否开启抗锯齿
            renderer = new THREE.WebGLRenderer({ antialias: true })
            renderer.setSize(window.innerWidth, window.innerHeight)
            renderer.setClearColor(0xeeeeee)
            document.body.appendChild(renderer.domElement);
        }
        // 初始化场景
        function initScene() {
            scene = new THREE.Scene();
            //给场景添加烟雾效果
            // 参数:烟雾颜色,烟雾范围near,烟雾范围far
            scene.fog = new THREE.Fog(0x000000, 0, 3000)
            // 给场景添加坐标轴
            var axes = new THREE.AxesHelper(100)
            scene.add(axes)
        }
        // 初始化相机
        function initCamera() {
            camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000)
            camera.position.x = 50
            camera.position.y = 50
            camera.position.z = 50
        }
        // 初始化控制器
        function initControls() {
            controls = new THREE.OrbitControls(camera, renderer.domElement)
        }
        // 初始化光源
        function initLight() {
            var pointLight = new THREE.PointLight(0xffffff, 1);
            pointLight.position.set(0, 100, 100);
            scene.add(pointLight);
            var pointLight = new THREE.PointLight(0xffffff, 1);
            pointLight.position.set(0, 100, -100);
            scene.add(pointLight);
        }
        function initText() {
            var loader = new FontLoader();
            loader.load('./fonts/FZKaTong-M19S_Regular.json', function (response) {
                // 创建文字几何图形
                var textGeometry = new TextGeometry('狗托吴嘉豪', {
                    font: response,
                    // 字体大小
                    size: 15,
                    // 字体的厚度
                    height: 4,
                    // 文本曲线上的点的数量,越高曲线越平滑
                    curveSegments: 12,
                    // 是否开启斜角(棱角平滑过渡)
                    bevelEnabled: true,
                    // 文本上斜角的深度
                    bevelThickness: 0.1,
                    // 斜角与原始文本轮廓之间的延伸距离(斜角尺寸)
                    bevelSize: .1,
                    // 斜角分段数
                    bevelSegments: 3
                })
                // 文字材质
                // 使用材质数组
                var textMaterial = [
                    // 第一项修饰文字正面背面
					new THREE.MeshPhongMaterial( { color: 0x00ff00, flatShading: true } ), // front
                    // 第二项修饰文字侧面(顶部底部)
					new THREE.MeshPhongMaterial( { color: 0x0000ff, flatShading: true } ) // side
                    // Phong网格材质可以模拟具有镜面高光的光泽表面(例如涂漆木材)
				]
                var text = new THREE.Mesh(textGeometry, textMaterial)
                // computeBoundingBox()计算当前几何体的的边界矩形
				textGeometry.computeBoundingBox();
                // console.log(textGeometry.boundingBox);
                var centerOffset = -0.5*(textGeometry.boundingBox.max.x-textGeometry.boundingBox.min.x)
                text.position.x = centerOffset
                text.position.z = 0
                scene.add(text);
                // 创建文字镜像
                var mirror = new THREE.Mesh(textGeometry, textMaterial)
                mirror.rotation.x = Math.PI
                mirror.position.x = centerOffset
                mirror.position.y = -8
                scene.add(mirror)
                // 创建半透明平面
                var plane = new THREE.Mesh(new THREE.PlaneBufferGeometry(200,200),new THREE.MeshBasicMaterial({color:0xffffff,opacity:.5,transparent:true}))
                plane.rotation.x = -Math.PI / 2
                plane.position.y = -3
                scene.add(plane)
            })
        }
        function render() {
            renderer.render(scene, camera);
            requestAnimationFrame(render)
        }
        function start() {
            initRenderer()
            initScene();
            initCamera();
            initControls()
            initLight()
            initText()
            render()
        }
        start()
    </script>

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Three.js实现脸书元宇宙3D动态Logo效果

    目录 背景 什么是元宇宙 实现效果 试炼一:THREE.TorusGeometry 试炼二:THREE.TorusKnotGeometry 试炼三:THREE.TubeGeometry 试炼四:Blender + Three.js 用Blender建模 加载Logo模型 添加材质 展示加载进度 点击更换材质 加载人物模型 总结 参考资料 本文主要讲述通过 Three.js + Blender 技术栈,实现 Meta 公司炫酷的 3D 动态 Logo,内容包括基础模型圆环.环面扭结.管道及模型生成

  • 使用three.js实现炫酷的酸性风格3D页面效果

    本文内容主要介绍,通过使用React+three.js技术栈,加载3D模型.添加3D文字.增加动画.点击交互等,配合样式设计,实现充满设计感的

  • three.js如何实现3D动态文字效果

    前言 大家好,这里是 CSS 魔法使--alphardex. 之前在逛国外网站的时候,发现有些网站的文字是刻在3D图形上的,并且能在图形上运动,视觉效果相当不错,于是笔者就也想用three.js来尝试复现出这种效果 上图只是所有效果的其中之一,接下来让我们一起开干吧~ 准备工作 笔者自行封装的three.js模板:Three.js Starter 读者可以点击右下角fork一份后再开始本项目 本项目需要用到位图字体,可以直接复制demo的HTML里的font字体代码 一个注意点:three-bm

  • three.js中多线程的使用及性能测试详解

    前言 今天郭先生说一下WebWorker以及WebWorker在three.js中的应用.我们都知道Javascript是单线程的,比如执行js代码的同时UI渲染就会停止,对于多核CPU的点脑,这一点让人难以接受,好在Web Worker的出现多少解决了一些问题.官方说Web Worker指的是一种可由脚本创建的后台任务,任务执行中可以向其创建者收发信息.要创建一个 Worker ,只须调用 Worker(URL) 构造函数,函数参数 URL 为指定的脚本.关于Web Worker的更多知识请阅

  • three.js 实现露珠滴落动画效果的示例代码

    前言 大家好,这里是 CSS 魔法使--alphardex. 本文我们将用three.js来实现一种很酷的光学效果--露珠滴落.我们知道,在露珠从一个物体表面滴落的时候,会产生一种粘着的效果.2D平面中,这种粘着效果其实用css滤镜就可以轻松实现.但是到了3D世界,就没那么简单了,这时我们就得依靠光照来实现,其中涉及到了一个关键算法--光线步进(Ray Marching).以下是最终实现的效果图 撒,哈吉马路由! 准备工作 笔者的 three.js模板 :点击右下角的fork即可复制一份 正片

  • 使用three.js 绘制三维带箭头线的详细过程

    需求:这个需求是个刚需啊!在一个地铁场景里展示逃生路线,这个路线肯定是要有指示箭头的,为了画这个箭头,我花了不少于十几个小时,总算做出来了,但始终有点问题.我对这个箭头的要求是,无论场景拉近还是拉远,这个箭头不能太大,也不能太小看不清,形状不能变化,否则就不像箭头了. 使用到了 three.js 的 Line2.js 和一个开源库MeshLine.js 部分代码: DrawPath.js: /** * 绘制路线 */ import * as THREE from '../build/three.

  • javascript Three.js创建文字初体验

    目录 效果 开始创建文本 首先创建字体加载器 加载字体库 创建文字几何体 计算文字几何体外边界矩形 创建镜像文字 创建半透明平面 渲染 关于文本构造器参数 当curveSegments设置越低时,可以看到文字没有那么圆滑 当开启了斜角时,可以观察到字体的边棱变得圆滑,不再锐利 设置斜角参数 完整代码 总结 效果 首先引入必要组件 import './build/three.js'; import './libs/js/controls/OrbitControls.js' import { Fon

  • vue.js 初体验之Chrome 插件开发实录

    背景 对于经常和动画开发打交道的开发者对于Animate.css这个动画库不会陌生,它把一些常见的动画效果都封装起来了,非常实用.但是有时候在开发中,仅仅只是需要某一两个动画效果,把整个CSS文件都引入,这样不是太好. 需求就出现了,能不能有一个工具可以直接预览Animate.css对应的动画效果,并且生成对应的动画代码呢? 作为一个UI开发,平时跟Chrome浏览器打交道最多,于是就整了一个Chrome插件可以及时预览对应Animate.css中的动画效果并生成对应的动画代码,这样在实际开发中

  • js原型链与继承解析(初体验)

    首先定义一个对象obj,该对象的原型为obj._proto_,我们可以用ES5中的getPrototypeOf这一方法来查询obj的原型,我们通过判断obj的原型是否与Object.prototype相等来证明是否存在obj的原型,答案返回true,所以存在.然后我们定义一个函数foo(),任何一个函数都有它的prototype对象,即函数的原型,我们可以在函数的原型上添加任意属性,之后通过new一个实例化的对象可以共享其属性(下面的两个例子会详细介绍). function foo(){} fo

  • JavaScript入门初体验书写方式

    目录 javascript历史 javascript是什么? javascript的作用 浏览器执行js简介 javascript的组成 ECMAScript javascript初体验 行内式 内嵌JS 外部JS文件 结语 javascript历史 布兰登艾奇( Brendan Eich ,1961年-). 神奇的大哥在1995年利用10天完成 JavaScript 设计. 网景公司最初命名为 LiveScript ,后来在与 Sun 合作之后将其改名为 JavaScript .(很大部分也是

  • JS代理对象Proxy初体验简单的数据驱动视图

    目录 引言 Proxy对象是什么 使用Proxy写一个简单的数据驱动视图 引言 上大学的时候,最流行的框架是JQuery,它是事件驱动类型的,也就是说,当一个数据与DOM的某个内容相关联的时候,我需要在这个数据改变之后,去操作DOM来进行同步: <div id="data">数据</div> var data = "数据" // 通过某种事件数据发生了变化 data = "新数据" $("#data")

  • node.js爬虫框架node-crawler初体验

    百度爬虫这个词语,一般出现的都是python相关的资料. py也有很多爬虫框架,比如scrapy,Portia,Crawley等. 之前我个人更喜欢用C#做爬虫. 随着对nodejs的熟悉.发现做这种事情还是用脚本语言适合多了,至少不用写那么多的实体类.而且脚本一般使用比较简单. 在github上搜索node+spider,排名第一的就是node-crawler github:https://github.com/bda-research/node-crawler 简单使用 npm 安装: np

  • AJAX初体验之实战篇——打造博客无刷新搜索

    如果你对AJAX不是很了解,可以先看看这篇教程的前篇<AJAX初体验之上手篇>. 现在博客很流行,相信应该上网时间稍微长点的朋友都会在这或者在那的有一个自己的博客.对于一些有一定能力的朋友,可能更喜欢自己去下载一个博客程序来架设一个自己的博客,而不是使用一些博客网站提供的服务.而大部分博客程序所带的搜索功能是提交查询关键字到搜索页面,然后在后台生成搜索结果,再呈现给用户,这过程之中浪费了一些带宽,如博客的侧边栏.要节约这一些带宽,我们可以用AJAX来打造自己的无刷新日志搜索. 在本篇教程中,数

  • 使用Vue.js创建一个时间跟踪的单页应用

    Vue.js很简单.正因为如此简单,人们常常认为其适合于小项目.虽然真正的Vue.js核心知识只是一个视图层库,实际上有一组工具,将使您能够使用Vue.js构建完整的大规模SPA(单页应用程序). SPA应用可以在不完全重新加载网页,产生一个更流畅的用户体验到的用户交互响应.还有好的副作用,SPA还鼓励后端专注于展示数据端点,这使得整体架构更加分离,并且对于其他类型的客户端可能是可重用的. 从开发人员的角度来看,SPA和传统的后端呈现应用程序之间的主要区别是,我们必须将客户端视为具有自己架构的应

  • JavaScript实现隐藏省略文字效果的方法

    本文实例讲述了JavaScript实现隐藏省略文字效果的方法.分享给大家供大家参考,具体如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB2312" /> <title>JS</title> </head> <body> <div id="content&qu

  • js实现文字跟随鼠标移动而移动的方法

    本文实例讲述了js实现文字跟随鼠标移动而移动的方法.分享给大家供大家参考.具体分析如下: 这是一款非常简单的鼠标特性代码,在网页中移动鼠标的时候,后面跟着一串文字跟随者鼠标移动 复制代码 代码如下: <html> <head> <style type="text/css"> .spanstyle { COLOR: 000000; FONT-SIZE: 10pt; POSITION: absolute; TOP: -50px; VISIBILITY:

随机推荐