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写的一个自定义弹出式对话框代码
Jan 17 Javascript
js实现字符串和数组之间相互转换操作
Jan 12 Javascript
JavaScript高级程序设计(第三版)学习笔记1~5章
Mar 11 Javascript
AngularJs解决跨域问题案例详解(简单方法)
May 19 Javascript
javascript时间差插件分享
Jul 18 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
Dec 08 Javascript
简单实现jQuery上传图片显示预览功能
Jun 29 jQuery
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
JQuery实现table中tr上移下移的示例(超简单)
Jan 08 jQuery
angular5 httpclient的示例实战
Mar 12 Javascript
微信小程序地图实现展示线路
Jul 29 Javascript
js实现鼠标点击飘爱心效果
Aug 19 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 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
php使用$_POST或$_SESSION[]向js函数传参
2014/09/16 PHP
php开发工具有哪五款
2015/11/09 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
JavaScript的Function详细
2006/11/14 Javascript
javascript 自定义事件初探
2009/08/21 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
jquery事件的ready()方法使用详解
2015/11/11 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
利用Python实现简单的相似图片搜索的教程
2015/04/23 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
详解【python】str与json类型转换
2019/04/29 Python
python 同时读取多个文件的例子
2019/07/16 Python
python实现俄罗斯方块游戏(改进版)
2020/03/13 Python
菲律宾最大的网上花店和礼品店:PhilFlower.com
2018/02/09 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
高中的自我鉴定
2013/12/16 职场文书
医药类个人求职的自我评价
2014/02/12 职场文书
班干部竞选演讲稿
2014/04/24 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
公司员工体检通知
2015/04/21 职场文书
MySQL中VARCHAR与CHAR格式数据的区别
2021/05/26 MySQL