利用Three.js制作一個新聞聯(lián)播開頭動畫
在線體驗地址:點我預覽
代碼地址:點我github
這里才是引言
五一居家隔離,閑著也是閑著,想著整個活兒,于是就有了這個項目。
項目本身不是很難,但是中間確實是遇到了一些小問題,斷斷續(xù)續(xù)也是花費了三四天時間才寫完,還有一些需要優(yōu)化的地方,后續(xù)有時間再整。
我會從腳手架開始,按照場景中出現(xiàn)的物體順序逐條進行講解制作,每個物體將分為獨立的一篇文章,方便理解。Go。
技術選型
- 選用
vite
作為構建工具; - 選用
three.js
作為三維庫; - 選用
tween.js
作為動畫庫(three.js
包里自帶一個,不需要額外安裝) - 其他就沒了,就這么簡單。
場景分解
已經(jīng)忘記新聞聯(lián)播片頭的小伙伴可以搜一下視頻去回顧下。
我將片頭場景中出現(xiàn)的物體分為這幾個:
- 背景音樂
- 背景圖:宇宙背景,有往外飛的射線和氤氳的氣
- 地球:從右下角飛到畫面正中間,不斷旋轉(zhuǎn),地球上方的云比地球轉(zhuǎn)得略慢
- 紅綠藍三條色帶:從畫面的三個角依次往對角線飛過
- 出現(xiàn)的三維文字:其實分為四段,依次有動畫,到文字章節(jié)的時候細說
代碼邏輯分解
有了場景分解后,我們只要去寫對應的代碼就可以了。通過three.js代碼生成相應物體,并且使用tween.js給物體配上對應的補間動畫,達到整個場景的運動效果。
值得注意的是,該項目中所有動畫都是連貫播放的,所以需要將應用到的素材都提前加載好,不然會出現(xiàn)物體一開始是黑色的,運動了一會兒才有貼圖這種情況。
我們按照以上邏輯,預先建好各個js文件:
bg.js
負責創(chuàng)建背景preload.js
負責預加載資源initThree.js
負責初始化三維場景rgb.js
負責創(chuàng)建紅綠藍色條色帶及其動畫earth.js
負責創(chuàng)建地球及其動畫text.js
負責創(chuàng)建三維文字及其動畫play.js
最后一個js文件,負責開始播放整個場景的動畫
額外的,背景音樂通過 audio
標簽插入到dom中,并在play中隨動畫一起觸發(fā)播放。
創(chuàng)建背景圖和背景音樂
本來作為 用three.js做一個新聞聯(lián)播開頭動畫 專題的序章,本文就應該到此了,下一章按順序應該介紹背景圖和背景音樂的創(chuàng)建。
但是想想背景圖和背景音樂不屬于three.js的范疇,篇幅也比較短,直接在此帶過,下一章直接介紹地球的創(chuàng)建好了。
背景圖
正宗片頭中的背景圖是比較酷炫的,而我自己經(jīng)歷從 自己寫shader 到 找一個類似的gif背景 最后到 簡單用css寫一個背景拉倒了 的心理過程。
首先,我們在html中插入背景圖的div,并賦予id。
<div id="bg"></div>
其css如下,保證和three場景大小一致,并且疊在three場景下方。
#bg { width: 100%; height: 100%; position: absolute; overflow: hidden; perspective: 10vmin; background: radial-gradient( circle farthest-corner at center center, #b5bdca, #666 ); } .star { z-index: 1; --unit: 1.5vmin; width: var(--unit); height: var(--unit); --rotate: rotateY(90deg); transform: translateZ(-100vmin) var(--rotate) rotateX(var(--rx)) translateZ(var(--x)) scaleX(1); position: absolute; top: 0; left: 0; animation: none 1800ms infinite ease-in; background: #d1e8f7; } @keyframes hyper { 0% { opacity: 1; } 90% { opacity: 1; } 100% { opacity: 0; transform: translateZ(0vmin) var(--rotate) rotateX(var(--rx)) translateZ(var(--x)) scaleX(2); } }
我們使用css3的動畫和變形,創(chuàng)造出宇宙射線向外設的效果, bg.js
中代碼如下 :
const starCount = 10; const bgDom = document.getElementById("bg"); for (let i = 0; i < starCount; i++) { const div = document.createElement("div"); div.classList.add("star"); bgDom.append(div); let x = `${Math.random() * 200}vmax`; let y = `${Math.random() * 100}vh`; let z = `${Math.random() * 200 - 100}vmin`; let rx = `${Math.random() * 360}deg`; div.style.setProperty("--x", x); div.style.setProperty("--y", y); div.style.setProperty("--z", z); div.style.setProperty("--rx", rx); let delay = `${Math.random() * 2000}ms`; div.style.animationDelay = delay; div.style.animationName = "hyper"; }
背景音樂
說到這個屬實氣,各個瀏覽器兼容不一致,new Audio()
出來的也會有不一致,一開始繞了很大的彎子。
最后使用很傳統(tǒng)的方法,在html中插入 audio
標簽,并將三種格式的音樂都引進來,根據(jù)瀏覽器的不同自動判斷加載哪個。
需要注意的是,要加上preload屬性,表示預加載。
<audio preload="auto" id="bgm"> <source src="/assets/bgm.ogg" /> <source src="/assets/bgm.mp3" /> <source src="/assets/bgm.wav" /> </audio>
創(chuàng)建完成后,在 play.js
中可通過id獲取到該音樂并播放,這是后話了。
到此這篇關于利用Three.js制作一個新聞聯(lián)播開頭動畫的文章就介紹到這了,更多相關Three.js 新聞聯(lián)播開頭動畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用echarts餅狀圖label既在內(nèi)部顯示數(shù)值(百分比),又顯示外部指示線
這篇文章主要介紹了使用echarts餅狀圖label既在內(nèi)部顯示數(shù)值(百分比),又顯示外部指示線問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03layui 關閉open彈出框 刷新table表格頁面的方法
今天小編就為大家分享一篇layui 關閉open彈出框 刷新table表格頁面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09vant uploader實現(xiàn)上傳圖片拖拽功能(設為封面)
這篇文章主要介紹了vant uploader實現(xiàn)上傳圖片拖拽功能(設為封面),這個功能在日常生活中經(jīng)常會用到,操作非常方便,今天通過實例代碼介紹實現(xiàn)過程,需要的朋友可以參考下2021-10-10