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 相关文章推荐
jQuery 获取对象 基本选择与层级
May 31 Javascript
getElementByIdx_x js自定义getElementById函数
Jan 24 Javascript
Textarea根据内容自适应高度
Oct 28 Javascript
jQuery .tmpl() 用法示例介绍
Aug 21 Javascript
javascript弹出页面回传值的方法
Jan 28 Javascript
基于jQuery实现动态数字展示效果
Aug 12 Javascript
Javascript基于AJAX回调函数传递参数实例分析
Dec 15 Javascript
AngularJS Bootstrap详细介绍及实例代码
Jul 28 Javascript
基于jQuery的左滑出现删除按钮的示例
Aug 29 jQuery
JS 数组随机洗牌的实例代码
Sep 12 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
Oct 02 Javascript
解决layui的input独占一行的问题
Sep 10 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 $_ENV为空的原因分析
2009/06/01 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
javascript instanceof,typeof的区别
2010/03/24 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
日期处理的js库(迷你版)--自建js库总结
2011/11/21 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
前端构建工具之gulp的配置与搭建详解
2017/06/12 Javascript
jQuery EasyUI 折叠面板accordion的使用实例(分享)
2017/12/25 jQuery
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
JavaScript实现的3D旋转魔方动画效果实例代码
2019/07/31 Javascript
通过扫小程序码实现网站登陆功能
2019/08/22 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
Python文件读取的3种方法及路径转义
2015/06/21 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python+tkinter使用40行代码实现计算器功能
2018/01/30 Python
python模拟表单提交登录图书馆
2018/04/27 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
python学习开发mock接口
2019/04/28 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python中函数返回多个结果的实例方法
2020/12/16 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
EJB的基本架构
2016/09/22 面试题
就业自我评价
2014/02/04 职场文书
《四季》教学反思
2014/04/08 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python
关于CSS浮动与取消浮动的问题
2021/06/28 HTML / CSS
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript