three.js显示中文字体与tween应用详析
今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画。线案例请点击,
1. 生成中文字体
我们都使用过three.js的FontLoader加载typeface.json实现font的使用,很多案例都是英文字体,那么如何来生成中文字体呢?现在我们可以通过实现ttf向typeface.json的转换。 我们在网上下载ttf中文字体(或者在电脑的C:\Windows\Fonts直接复制一份中文的ttf字体),然后我们登陆,选中准备好的ttf文件,点击convert即可。得到的json文件就可以使用FontLoader加载了,其实还是挺简单的,中文ttf一般都比较大,所以在选择喜欢字体的,也要考虑好文件的大小。
2. tween操作文字动画
之前也说过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是动画的缓动效果里面有很多种,不妨打印出来看一下
然后就是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.s(); tween2.s(); tween3.s(); if(flag == 0) { tween1.start(); } else if(flag == 1) { tween2.start(); } else if(flag == 2) { tween3.start(); } flag = (flag + 1) % 3; },
这里注意,由于点击切换的时候动画上一个动画可能没有完成,所以先调用s方法,让动画先停下来。别忘了在render函数中调用TWEEN.update(),不然动画是不会执行的。
到此这篇关于three.js显示中文字体与tween应用的文章就介绍到这了,更多相关three.js显示中文字体与tween应用内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
版权声明本文为郭志强的原创文章,原文链接
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程