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学习小结之被嫌弃的eval函数和with语句实例详解
Aug 01 Javascript
Angular2 环境配置详细介绍
Sep 21 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
JavaScript事件用法浅析
Oct 31 Javascript
微信小程序 网络API Websocket详解
Nov 09 Javascript
JavaScript数据结构之二叉树的计数算法示例
Apr 13 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
Mar 29 Javascript
jQuery中图片展示插件highslide.js的简单dom
Apr 22 jQuery
nuxt框架中路由鉴权之Koa和Session的用法
May 09 Javascript
JavaScript函数的特性与应用实践深入详解
Dec 30 Javascript
Vue发布订阅模式实现过程图解
Apr 30 Javascript
解决Can't find variable: SockJS vue项目的问题
Sep 22 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实现的MySQL通用查询程序
2007/03/11 PHP
PHP下打开phpMyAdmin出现403错误的问题解决方法
2013/05/23 PHP
php libevent 功能与使用方法详解
2020/03/04 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
JavaScript 创建对象
2009/07/17 Javascript
基于jquery的返回顶部效果(兼容IE6)
2011/01/17 Javascript
jquery对表单操作2
2011/04/06 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
js代码验证手机号码和电话号码是否合法
2015/07/30 Javascript
AngularJS入门教程之Select(选择框)详解
2016/07/27 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
HTML5+jQuery实现搜索智能匹配功能
2017/03/24 jQuery
jquery网页加载进度条的实现
2017/06/01 jQuery
详解angular 中的自定义指令之详解API
2017/06/20 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
ExtJs使用自定义插件动态保存表头配置(隐藏或显示)
2018/09/25 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
2018/12/12 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
Java编程面试题
2016/04/04 面试题
保安的辞职报告怎么写
2014/01/20 职场文书
初中科学教学反思
2014/01/21 职场文书
求职信范文怎么写
2014/01/29 职场文书
料理师求职信
2014/01/30 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
测量JavaScript函数的性能各种方式对比
2021/04/27 Javascript
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL