欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

three.js顯示中文字體與tween應(yīng)用詳析

 更新時(shí)間:2021年01月04日 11:25:24   作者:郭志強(qiáng)  
這篇文章主要給大家介紹了關(guān)于three.js顯示中文字體與tween應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

今天郭先生說一下如何在three中顯示中文字體,然后結(jié)合tween實(shí)現(xiàn)文字位置的動(dòng)畫。線案例請(qǐng)點(diǎn)擊chinese-font,

1. 生成中文字體

我們都使用過three.js的FontLoader加載typeface.json實(shí)現(xiàn)font的使用,但是很多案例都是英文字體,那么如何來生成中文字體呢?現(xiàn)在我們可以通過Facetype.js實(shí)現(xiàn)ttf向typeface.json的轉(zhuǎn)換。 首先我們?cè)诰W(wǎng)上下載ttf中文字體(或者在電腦的C:\Windows\Fonts直接復(fù)制一份中文的ttf字體),然后我們登陸Facetype.js網(wǎng)站,選中準(zhǔn)備好的ttf文件,點(diǎn)擊convert即可。得到的json文件就可以使用FontLoader加載了,其實(shí)還是挺簡(jiǎn)單的,中文ttf一般都比較大,所以在選擇喜歡字體的同時(shí),也要考慮好文件的大小。

2. tween操作文字動(dòng)畫

之前也說過tween動(dòng)畫,不過我覺得挺有意思的,我們就拿百家姓來作文字素材。

效果就是這樣的,我們讓tween實(shí)現(xiàn)從圖一到圖二到圖三再到圖一的動(dòng)畫,每個(gè)漢字除了位置的變化還有朝向(lookAt)的變化。這里的lookAt方法就是設(shè)置物體的朝向。好了開始上代碼。

1.設(shè)置點(diǎn)的位置和朝向

圖一中點(diǎn)的位置可以在平面幾何體中取點(diǎn)

let vertices1 = new THREE.PlaneGeometry(1400, 900, 13, 6).vertices;

他們的朝向相對(duì)于每個(gè)字來說都是Vector3(0, 0, 1),所以可以設(shè)置為

d.position.clone().add(Vector3(0, 0, 1)) //這里的d.position就是每個(gè)點(diǎn)的位置

圖二中點(diǎn)的位置可以在球體中獲取

let vertices2 = new THREE.SphereGeometry(500, 12, 9).vertices;

他們的朝向很容易找,就是朝向中心點(diǎn)就可以Vector3(0, 0, 0) 圖三中的點(diǎn)可以通過計(jì)算得到,就是一組旋轉(zhuǎn)上升的點(diǎn)

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));
}

他們的朝向可以設(shè)置為

new THREE.Vector3(0, d.position.y, 0) //d.position.y就是點(diǎn)的y坐標(biāo)

這樣就設(shè)置好了點(diǎn),接下來就制作動(dòng)畫

2.tween動(dòng)畫

首先初始化三個(gè)動(dòng)畫

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是動(dòng)畫的緩動(dòng)效果里面有很多種,不妨打印出來看一下

然后就是onUpdate方法

function onUpdate() {
 let time = this._object.time; //動(dòng)畫時(shí)刻值
 if(flag == 0) {//這里有三段動(dòng)畫flag判斷是那一段動(dòng)畫
 group.children.forEach((d, i) => {//group里面包含著所有文字網(wǎng)格
  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)));
 })
 }
}

最后通過點(diǎn)擊觸發(fā)

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;
},

這里注意,由于點(diǎn)擊切換的時(shí)候動(dòng)畫上一個(gè)動(dòng)畫可能沒有完成,所以先調(diào)用stop方法,讓動(dòng)畫先停下來。別忘了在render函數(shù)中調(diào)用TWEEN.update(),不然動(dòng)畫是不會(huì)執(zhí)行的。

總結(jié)

到此這篇關(guān)于three.js顯示中文字體與tween應(yīng)用的文章就介紹到這了,更多相關(guān)three.js顯示中文字體與tween應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

版權(quán)聲明:本文為郭志強(qiáng)的原創(chuàng)文章,原文鏈接:https://www.mrguo.link

相關(guān)文章

  • JS中圖片壓縮的方法小結(jié)

    JS中圖片壓縮的方法小結(jié)

    這篇文章主要介紹了JS中圖片壓縮的方法,包括等比壓縮圖片的方法,需要的朋友可以參考下
    2017-11-11
  • JSQL 批量圖片切換的實(shí)現(xiàn)代碼

    JSQL 批量圖片切換的實(shí)現(xiàn)代碼

    其實(shí)這個(gè)example也很簡(jiǎn)單, 就是根據(jù)where后的條件批量修改element的屬性,此處為Img元素
    2010-05-05
  • 簡(jiǎn)單實(shí)現(xiàn)JS對(duì)dom操作封裝

    簡(jiǎn)單實(shí)現(xiàn)JS對(duì)dom操作封裝

    這篇文章主要介紹了簡(jiǎn)單實(shí)現(xiàn)JS對(duì)dom操作封裝,需要的朋友可以參考下
    2015-12-12
  • 深入淺析JavaScript中with語句的理解

    深入淺析JavaScript中with語句的理解

    JavaScript 有個(gè) with 關(guān)鍵字, with 語句的原本用意是為逐級(jí)的對(duì)象訪問提供命名空間式的速寫方式。這篇文章主要介紹了JavaScript中with語句的相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口

    js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口

    本文主要介紹了js實(shí)現(xiàn)不提示直接關(guān)閉網(wǎng)頁窗口的方法。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript的History API使搜索引擎抓取AJAX內(nèi)容

    JavaScript的History API使搜索引擎抓取AJAX內(nèi)容

    這篇文章主要介紹了JavaScript的History API使搜索引擎抓取AJAX內(nèi)容 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • JavaScript和CSS通過expression實(shí)現(xiàn)Table居中顯示

    JavaScript和CSS通過expression實(shí)現(xiàn)Table居中顯示

    如何將表格居中的顯示使用一個(gè)叫expression的函數(shù),多數(shù)的瀏覽器都支持這個(gè)函數(shù),感興趣的朋友可以看一下具體的實(shí)現(xiàn)哈
    2013-06-06
  • JavaScript中遍歷的十種方法總結(jié)

    JavaScript中遍歷的十種方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于JavaScript中遍歷的十種方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • JS前端廣告攔截實(shí)現(xiàn)原理解析

    JS前端廣告攔截實(shí)現(xiàn)原理解析

    這篇文章主要介紹了JS前端廣告攔截實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 老生常談js中的MVC

    老生常談js中的MVC

    下面小編就為大家?guī)硪黄仙U刯s中的MVC。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07

最新評(píng)論