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 相关文章推荐
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
JQuery实现倒计时按钮的实现代码
Mar 23 Javascript
JS实现点击颜色块切换指定区域背景颜色的方法
Feb 25 Javascript
JavaScript计算某一天是星期几的方法
Aug 05 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
基于javascript实现按圆形排列DIV元素(三)
Dec 02 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
javascript事件监听与事件委托实例详解
Aug 16 Javascript
jQuery zTree树插件的使用教程
Aug 16 jQuery
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 Javascript
elementui更改el-dialog关闭按钮的图标d的示例代码
Aug 04 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
如何选购合适的收音机
2021/03/01 无线电
PHP批量采集下载美女图片的实现代码
2013/06/03 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
jQuery.holdReady()方法用法实例
2014/12/27 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
JS获取网页图片name属性的方法
2015/04/01 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
原生JavaScript制作微博发布面板效果
2016/03/11 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
2016/03/22 Javascript
javascript中sort排序实例详解
2016/07/24 Javascript
详解webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
2017/06/20 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
javascript设计模式 ? 抽象工厂模式原理与应用实例分析
2020/04/09 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
十个Python程序员易犯的错误
2015/12/15 Python
简单了解Django模板的使用
2017/12/20 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
Python实现的ftp服务器功能详解【附源码下载】
2019/06/26 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
求职简历中自我评价
2014/01/28 职场文书
王老吉广告词
2014/03/20 职场文书
应届硕士毕业生自荐信
2014/05/26 职场文书
交通违章检讨书
2014/09/21 职场文书
村党支部对照检查材料思想汇报
2014/09/28 职场文书
个人思想政治总结
2015/03/05 职场文书
我是特种兵观后感
2015/06/11 职场文书
小学思想品德教学反思
2016/02/24 职场文书
详解Mysql 函数调用优化
2021/04/07 MySQL