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 firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
JQuery 学习笔记 选择器之四
Jul 23 Javascript
基于jquery的回到页面顶部按钮
Jun 27 Javascript
js新闻滚动 js如何实现新闻滚动效果
Jan 07 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
Jun 24 Javascript
JavaScript入门基础
Aug 12 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
Dec 19 Javascript
Bootstrap和Java分页实例第二篇
Dec 23 Javascript
js判断iframe中元素是否存在的实现代码
Dec 24 Javascript
JavaScript继承定义与用法实践分析
May 28 Javascript
vuejs 动态添加input框的实例讲解
Aug 24 Javascript
Vue动画事件详解及过渡动画实例
Feb 09 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下通过伪造http头破解防盗链的代码
2010/07/03 PHP
一个PHP的QRcode类与大家分享
2011/11/13 PHP
php post大量数据时发现数据丢失问题解决方法
2015/06/20 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
php利用云片网实现短信验证码功能的示例代码
2017/11/18 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
document.compatMode介绍
2009/05/21 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
详解JavaScript逻辑Not运算符
2015/12/04 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
Nodejs+Socket.io实现通讯实例代码
2017/02/13 NodeJs
VUE实现表单元素双向绑定(总结)
2017/08/08 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
layui 表格的属性的显示转换方法
2018/08/14 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
使用C#配合ArcGIS Engine进行地理信息系统开发
2016/02/19 Python
详谈python3 numpy-loadtxt的编码问题
2018/04/29 Python
python安装gdal的两种方法
2019/10/29 Python
Python网络编程之使用TCP方式传输文件操作示例
2019/11/01 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
大一自我鉴定范文
2013/10/04 职场文书
师范毕业生自我鉴定
2014/01/15 职场文书
机关财务管理制度
2014/01/17 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python