three.js显示中文字体与tween应用详析


Posted in Javascript onJanuary 04, 2021

今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画。线案例请点击chinese-font,

1. 生成中文字体

我们都使用过three.js的FontLoader加载typeface.json实现font的使用,但是很多案例都是英文字体,那么如何来生成中文字体呢?现在我们可以通过Facetype.js实现ttf向typeface.json的转换。 首先我们在网上下载ttf中文字体(或者在电脑的C:\Windows\Fonts直接复制一份中文的ttf字体),然后我们登陆Facetype.js网站,选中准备好的ttf文件,点击convert即可。得到的json文件就可以使用FontLoader加载了,其实还是挺简单的,中文ttf一般都比较大,所以在选择喜欢字体的同时,也要考虑好文件的大小。

2. tween操作文字动画

之前也说过tween动画,不过我觉得挺有意思的,我们就拿百家姓来作文字素材。

three.js显示中文字体与tween应用详析

three.js显示中文字体与tween应用详析

three.js显示中文字体与tween应用详析

效果就是这样的,我们让tween实现从图一到图二到图三再到图一的动画,每个汉字除了位置的变化还有朝向(lookAt)的变化。这里的lookAt方法就是设置物体的朝向。好了开始上代码。

1.设置点的位置和朝向

图一中点的位置可以在平面几何体中取点

let vertices1 = new THREE.PlaneGeometry(1400, 900, 13, 6).vertices;

他们的朝向相对于每个字来说都是Vector3(0, 0, 1),所以可以设置为

d.position.clone().add(Vector3(0, 0, 1)) //这里的d.position就是每个点的位置

图二中点的位置可以在球体中获取

let vertices2 = new THREE.SphereGeometry(500, 12, 9).vertices;

他们的朝向很容易找,就是朝向中心点就可以Vector3(0, 0, 0) 图三中的点可以通过计算得到,就是一组旋转上升的点

for(let i=0; i<98; i++) {
 let x = Math.sin(Math.PI / 12 * i) * 400;
 let y = (49 - i) * 8;
 let z = Math.cos(Math.PI / 12 * i) * 400;
 positions3.push(new THREE.Vector3(x,y,z));
}

他们的朝向可以设置为

new THREE.Vector3(0, d.position.y, 0) //d.position.y就是点的y坐标

这样就设置好了点,接下来就制作动画

2.tween动画

首先初始化三个动画

initTween() {
 var pos = { time: 0 };
 tween1 = new TWEEN.Tween(pos).to({ time: 1 }, 1000);
 tween2 = new TWEEN.Tween(pos).to({ time: 2 }, 1000);
 tween3 = new TWEEN.Tween(pos).to({ time: 0 }, 1000);
 tween1.easing(TWEEN.Easing.Linear.None);
 tween2.easing(TWEEN.Easing.Linear.None);
 tween3.easing(TWEEN.Easing.Linear.None);
 tween1.onUpdate(onUpdate);
 tween2.onUpdate(onUpdate);
 tween3.onUpdate(onUpdate);
}

这里的easing是动画的缓动效果里面有很多种,不妨打印出来看一下

three.js显示中文字体与tween应用详析

然后就是onUpdate方法

function onUpdate() {
 let time = this._object.time; //动画时刻值
 if(flag == 0) {//这里有三段动画flag判断是那一段动画
 group.children.forEach((d, i) => {//group里面包含着所有文字网格
  d.position.copy(positions3[i].clone().multiplyScalar(time / 2).add(positions1[i].clone().multiplyScalar(1 - time / 2)));
  d.lookAt((new THREE.Vector3(0, d.position.y, 0).multiplyScalar(time / 2)).add(d.position.clone().add(lookAt1).multiplyScalar(1 - time / 2)));
 })
 } else if(flag == 1) {
 group.children.forEach((d, i) => {
  d.position.copy(positions1[i].clone().multiplyScalar(1 - time).add(positions2[i].clone().multiplyScalar(time)));
  d.lookAt((d.position.clone().add(lookAt1).multiplyScalar(1 - time)).add(lookAt2.multiplyScalar(time)));
 })
 } else if(flag == 2) {
 group.children.forEach((d, i) => {
  d.position.copy(positions2[i].clone().multiplyScalar(2 - time).add(positions3[i].clone().multiplyScalar(time - 1)));
  d.lookAt((lookAt2.multiplyScalar(2 - time)).add(new THREE.Vector3(0, d.position.y, 0).multiplyScalar(time - 1)));
 })
 }
}

最后通过点击触发

click() {
 tween1.stop();
 tween2.stop();
 tween3.stop();
 if(flag == 0) {
 tween1.start();
 } else if(flag == 1) {
 tween2.start();
 } else if(flag == 2) {
 tween3.start();
 }
 flag = (flag + 1) % 3;
},

这里注意,由于点击切换的时候动画上一个动画可能没有完成,所以先调用stop方法,让动画先停下来。别忘了在render函数中调用TWEEN.update(),不然动画是不会执行的。

总结

到此这篇关于three.js显示中文字体与tween应用的文章就介绍到这了,更多相关three.js显示中文字体与tween应用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

版权声明:本文为郭志强的原创文章,原文链接:https://www.mrguo.link

Javascript 相关文章推荐
基于JavaScript 类的使用详解
May 07 Javascript
原生JS和JQuery动态添加、删除表格行的方法
May 28 Javascript
js面向对象实现canvas制作彩虹球喷枪效果
Sep 24 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
原生js轮播特效
May 18 Javascript
详解Vue 方法与事件处理器
Jun 20 Javascript
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
详解vue中移动端自适应方案
May 05 Javascript
简单通过settimeout看javascript的运行机制
May 10 Javascript
vue实现将一个数组内的相同数据进行合并
Nov 07 Javascript
从零使用TypeScript开发项目打包发布到npm
Feb 14 Javascript
js用正则表达式筛选年月日的实例方法
Jan 04 #Javascript
vue中父子组件的参数传递和应用示例
Jan 04 #Vue.js
如何在VUE中使用vue-awesome-swiper
Jan 04 #Vue.js
vue项目如何监听localStorage或sessionStorage的变化
Jan 04 #Vue.js
element-ui封装一个Table模板组件的示例
Jan 04 #Javascript
ES2020让代码更优美的运算符 (?.) (??)
Jan 04 #Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 #Javascript
You might like
PHP递归遍历指定文件夹内的文件实现方法
2016/11/15 PHP
数组Array进行原型prototype扩展后带来的for in遍历问题
2010/02/07 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
jsonp原理及使用
2013/10/28 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
推荐10个2014年最佳的jQuery视频插件
2014/11/12 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
javascript轻量级库createjs使用Easel实现拖拽效果
2016/02/19 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
jQuery NProgress.js加载进度插件的简单使用方法
2018/01/31 jQuery
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
vuex存储复杂参数(如对象数组等)刷新数据丢失的解决方法
2019/11/05 Javascript
Python 列表排序方法reverse、sort、sorted详解
2016/01/22 Python
实例讲解python中的序列化知识点
2018/10/08 Python
Django框架序列化与反序列化操作详解
2019/11/01 Python
Django 批量插入数据的实现方法
2020/01/12 Python
Pycharm安装python库的方法
2020/11/24 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
纪伊国屋泰国网上书店:Kinokuniya泰国
2017/12/24 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
Haggar官网:美国男装品牌
2020/02/16 全球购物
建筑工程技术应届生求职信
2013/11/17 职场文书
大学生就业意向书范文
2014/04/01 职场文书
小学语文业务学习材料
2014/06/02 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang
oracle索引总结
2021/09/25 Oracle