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 替换Html标签实现代码
Oct 14 Javascript
让IE8支持DOM 2(不用框架!)
Dec 31 Javascript
juqery 学习之三 选择器 子元素与表单
Nov 25 Javascript
Array 重排序方法和操作方法的简单实例
Jan 24 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
jQuery快速实现商品数量加减的方法
Feb 06 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
Feb 13 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
JS实现百度搜索框关键字推荐
Feb 17 Javascript
Openlayers绘制地图标注
Sep 28 Javascript
vue mvvm数据响应实现
Nov 11 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静态类的原罪详解
2013/05/06 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
PHP处理Json字符串解码返回NULL的解决方法
2014/09/01 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
var与Javascript变量隐式声明
2009/09/17 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
js showModalDialog参数的使用详解
2014/01/07 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
javascript的tab切换原理与效果实现方法
2015/01/10 Javascript
jQuery的end()方法使用详解
2015/07/15 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
js弹出窗口返回值的简单实例
2016/05/28 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
2017/07/24 Javascript
微信小程序实现元素渐入渐出动画效果封装方法
2019/05/18 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
vue如何在项目中调用腾讯云的滑动验证码
2020/07/15 Javascript
jQuery加PHP实现图片上传并提交的示例代码
2020/07/16 jQuery
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
python实现对指定字符串补足固定长度倍数截断输出的方法
2018/11/15 Python
Python列表list排列组合操作示例
2018/12/18 Python
使用python的pandas为你的股票绘制趋势图
2019/06/26 Python
python操作excel让工作自动化
2019/08/09 Python
python按照list中字典的某key去重的示例代码
2020/10/13 Python
国际领先的学术出版商:Springer
2017/01/11 全球购物
实习自我鉴定模板
2013/09/28 职场文书
查环查孕证明
2014/01/10 职场文书
村主任“四风”问题个人对照检查材料思想汇报
2014/10/02 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
催款律师函范文
2015/05/27 职场文书
完美解决golang go get私有仓库的问题
2021/05/05 Golang
零基础学java之循环语句的使用
2022/04/10 Java/Android
教你如何用cmd快速登录服务器
2022/06/10 Servers