three.js 显示中文字体 和 tween应用
今天郭先生说一下如何在three中显示中文字体,然后结合tween实现文字位置的动画。线案例请点击博客原文。
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动画,不过我觉得挺有意思的,我们就拿百家姓来作文字素材。



效果就是这样的,我们让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.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应用的更多相关文章
- 解决CentOS无法显示中文字体 | 系统运维 | Web2.0
解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me 博客园 devops 前端 张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...
- PyOpenGL利用文泉驿正黑字体显示中文字体
摘要:在NeHe的OpenGL教程第43课源代码基础上,调用文泉驿正黑字体实现中文字体的显示 在OpenGL中显示汉字一直是个麻烦的事情,很多中文书籍的文抄公乐此不疲地介绍各种方法及其在windows ...
- Odoo 9 PDF不显示中文字体
在Ubuntu中安装中文字体: $ sudo apt-get install ttf-wqy-zenhei $ sudo apt-get install ttf-wqy-microhei
- QT程序中显示中文字体解决办法
Qt4.7.1 默认没有中文字体库,迅为给用户提供“文泉驿”字体和配置方法.本节需要的 文件在网盘: 用一个简单测试程序说明“文泉驿”字体的配置方法. 在 Qt Creater 新建工程“nihao” ...
- 英文版firefox显示中文字体丑的问题
在Options里面选择Content,在Fonts&Colors区域的Default font中,选择Times New Roman 如下图1: 在旁边的Advanced中选择,Fonts ...
- matplotlib显示中文字体
原始地址:http://zanyongli.i.sohu.com/blog/view/195716528.htm matplotlib 1.0.0版 对于3.0的可能不太适用,要注意语法结构! C:/ ...
- Chrome百度不显示中文字体
chrome://flags/ 启用DirectWrite 关闭就可以了
- 修复Ubuntu下XTerm不能正常显示中文字体的问题
打开/etc/X11/app-defaults/XTerm在最后添加如下代码: Xft.dpi:96 xpdf.title: PDF XTerm*faceSize: 1 ...
- iText类库再pdf中显示中文字体
using iTextSharp.text; using System; using System.Collections.Generic; using System.IO; using System ...
随机推荐
- 老猿学5G扫盲贴:中国移动5G融合计费漫游计费架构和路由方案
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的text属性
text属性保存按钮上显示的文字,如果按钮未设置文字则为空字符串.如果文字中包含有与符号('&'),则该按钮会自动设置一个快捷键,快捷键就是'&'后第一个字符,显示时会在该字符下加下划 ...
- 「Elasticsearch」SpringBoot快速集成ES
Elastic Search 的底层是开源库 Lucene.但是Lucene的使用门槛比较高,必须自己写代码去调用它的接口.而Elastic Search的出现正是为了解决了这个问题,它是 Lucen ...
- 派大星的烦恼MISC
挺有意思的杂项,python将二进制转图片的时候出现的图片不像二维码,想看题解的时候发现网上的大部分题解都是直接转发,更有意思了. 题目是派大星的烦恼,给了我们一张粉红图片,放进010editor里面 ...
- 文件重命名工具(ReNamer)7.2中文绿色便携专业版
ReNamer 是一个非常强大和灵活的文件重命名工具,它提供所有标准的重命名过程,包括前缀.后缀.替换.大小写更改以及删除括号内容.添加编号规则.更改文件扩展名等.对于高级用户,支持正则表达式和 Pa ...
- Scrum 冲刺 第三篇
Scrum 冲刺 第三篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 继续完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...
- 题解-CF1401E Divide Square
题面 CF1401E Divide Square 给一个正方形平面边长为 \(10^6\),给 \(n\) 条横线段和 \(m\) 条竖线段,每条线段都与正方形边缘相交且一条直线上不会有两条线段,求被 ...
- egg的基本使用
一.脚手架(可以快速生成项目) 1.新建一个项目文件夹,使用如下命令: 2.npm init egg --type=simple 3.npm i 它会根据package.json里记录的所需包进 ...
- SpringBoot使用Mybatis-plus及分页功能的细节部分
pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- 前端js部署
1 执行命令 cnpm run build 2.2 提取dist静态资源 将静态资源放置后端static下 /static文件是django后端的部署文件夹 3 Nginx写入配置文件 写入etc ...