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 26 Javascript
一个简单的网站访问JS计数器 刷新1次加1次访问
Sep 20 Javascript
js中top/parent/frame概述及案例应用
Feb 06 Javascript
JS delegate与live浅析
Dec 21 Javascript
减少访问DOM的次数提升javascript性能
Feb 24 Javascript
原生js结合html5制作小飞龙的简易跳球
Mar 30 Javascript
详解JavaScript的变量和数据类型
Nov 27 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
Jan 30 Javascript
JS对象创建的几种方式整理
Feb 28 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
Aug 04 Javascript
以v-model与promise两种方式实现vue弹窗组件
May 21 Javascript
vue better scroll 无法滚动的解决方法
Jun 07 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实现猴子选大王问题算法实例
2015/04/20 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
jQuery循环滚动展示代码 可应用到文字和图片上
2012/05/11 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
onkeydown事件解决按回车键直接提交数据的需求
2013/04/11 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
js中this用法实例详解
2015/05/05 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
Vue动态路由缓存不相互影响的解决办法
2019/02/19 Javascript
详解在HTTPS 项目中使用百度地图 API
2019/04/26 Javascript
Nodejs技巧之Exceljs表格操作用法示例
2019/11/06 NodeJs
Vue.js中的高级面试题及答案
2020/01/13 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
从零开始学Python第八周:详解网络编程基础(socket)
2016/12/14 Python
windows上安装Anaconda和python的教程详解
2017/03/28 Python
Python urls.py的三种配置写法实例详解
2017/04/28 Python
关于反爬虫的一些简单总结
2017/12/13 Python
django文档学习之applications使用详解
2018/01/29 Python
Python修改列表值问题解决方案
2020/03/06 Python
python矩阵运算,转置,逆运算,共轭矩阵实例
2020/05/11 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
学习经验演讲稿
2014/05/10 职场文书
机械专业求职信范文
2014/07/15 职场文书
邓小平理论心得体会
2014/09/09 职场文书
2014年科普工作总结
2014/12/06 职场文书
关于倡议书的范文
2015/04/29 职场文书
2015年幼儿园德育工作总结
2015/05/25 职场文书
一年级下册数学教学反思
2016/02/16 职场文书
七年级作文之冬景
2019/11/07 职场文书
go 实现简易端口扫描的示例
2021/05/22 Golang
如何在Python中妥善使用进度条详解
2022/04/05 Python