THREE.JS入門教學(4)建立粒子系統_基礎知識
Three.js是一個很棒的開源WebGL函式庫,WebGL允許JavaScript操作GPU,在瀏覽器端實現真正意義的3D。但目前這項技術還在發展階段,資料極為匱乏,愛好者學習基本上要透過Demo源碼和Three.js本身的源碼來學習。
0.簡介
嗨,又見面了。這麼說我們已經開始學習Three.js了,如果你還沒看過之前三篇教程,建議你先讀完。如果你已經讀完前面的教學了,你可能會想做一些關於粒子的東西。讓我們直面這個主題吧,每個人都愛粒子效果。不管你是否知道,你可以輕易地創造它們。
1.創建一個粒子系統
Three.js將粒子系統視為一個基本的幾何體,因為它就像基本幾何體一樣,即有形狀,又有位置、縮放因子、旋轉屬性。粒子系統將geometry物件裡的每一個點視為一個單獨的粒子。為什麼要這樣做?我想基於以下的原因:首先,整個粒子系統地繪製只需要調用一次某個繪製函數,而不是調用上千次;其次,這允許你設定一些全局的參數來影響你的粒子系統內的所有粒子。
即使是粒子系統被視為一個整體的對象,我們仍然可以為每個粒子單獨地著色,因為在繪製粒子系統的過程中,Three.js透過attribute變數colour向著色器傳遞了每一個頂點的顏色。我在本篇教程裡並不準備這樣做,如果你想知道這是怎麼完成的,你可以去GitHub上看Three.js的例行公事。
粒子系統可能還有一種特殊效果需要吸引你的注意:Three.js在粒子系統第一次被渲染的時候,會將其資料快取下來,之後你無法增加或減少系統中的粒子。如果你不希望看到某個粒子,你可以將它的顏色中的alpha值設為0,但你無法刪除它。所以你應在創建粒子系統的時候,就將所有可能需要顯示的粒子考慮進來。
開始建立粒子系統,只需要這麼多:
// 建立粒子geometry
var particleCount = 1800,
particles = new THREE.Geometry(),
pMaterial =
new TH. color: 0xFFFFFF,
size: 20
});
// 依序建立單一粒子
for(var p = 0; p // 粒子範圍在-250到250之間
var pX = Math.random() * 500 - 250,
pY = Math.random() * 500 - 250,
pZ = Math.random() * 500 - 250,
particle = new THREE.Vertex(
new THREE.Vector3(pX, pY, pZ)
);
// 將粒子加入粒子geometry
particles.vertices.push( particle);
}
// 建立粒子系統
var particleSystem =
new THREE.ParticleSystem(
particles,
pMaterial);
// 將粒子情境系統加入場景
scene.addChild(particleSystem);
如果你運行: 1.你會發現粒子都是方的
2.粒子都不動
我們一個一個來修復。
2.風格 我們創建一個粒子基本材質時傳入了顏色和尺寸。我們可能想做的是傳入一張紋理圖片用來顯示粒子,而這樣就可以很好地控製粒子看上去的樣式了。
你也看到,粒子是以方塊形狀繪製的,所以我們也應該使用一張方形的紋理圖片。為了看起來效果更好,我也會使用加法混合,但這樣做必須確保紋理圖片的背景是黑色的而不是透明的。我理解的原因是:現在加法混合和透明材質之間不相容。但沒關係,最後看起來會很棒。
我們來更新一下粒子基本材質和粒子系統,加入一些加法混合下透明的粒子。如果你喜歡,你也可以用我的粒子圖片。
var paterial =
new THREE.ParticleBasicMaterial({
color: 0xFFFFFF,
size: 20,
map: THREE.ImageUtils.loadTexture(
"images/particle.p." 🎜>blending: THREE.AdditiveBlending,
transparent: true
});
// 允許粒子系統對粒子排序,以達到我們想要的效果
particleSystem.sortParticles = true; >
這看起來已經好多了。現在來引入一點物理,讓粒子們動起來。
3.引入物理
預設情況下,粒子系統在三維空間中不運動,這很好。但我想讓他們動起來,而且我要讓粒子系統這樣運動:讓粒子繞著y軸旋轉。而且粒子在每個軸的範圍都在-250到250之間,所以繞著y軸旋轉以為這它們繞著系統地中心旋轉。
我還假定,你已經在某個地方有了幀循環的程式碼,和我在上一篇關於著色器中的教程中類似。所以這裡我們只需這樣:
// 幀循環
function update() {
// 增加一點旋轉量
particleSystem.rotation.y = 0.01;
// 繪製粒子系統
renderer.render(scene, era); // 設定下次刷新幀時對update的呼叫
requestAnimFrame(update);
}
這包含一下幾步: 1.給每一個粒子賦一個初始為0的速度
2.在每一幀中,為每一個粒子賦一個隨機的重力加速度
3.在每一幀中,透過加速度更新速度,透過速度更新位置
4.當一個粒子運動出了視線,重新設定初始位置和速度
聽起來很多,其實程式碼寫起來很少。首先,在創建粒子的過程中,我們為每個粒子增加一個水平速度:
particle.velocity = new THREE.Vector3(
0, // x
-Math.random(), // y: 隨機數
0); // z
function update(
// 增加旋轉量
particleSystem.rotation.y = 0.01;
var pCount = particleCount;
while(pCount--) {
// 取得單一粒子
while(pCount--) {
// 取得單一粒子
var partic = particles.vertices[pCount];
// 檢查是否需要重設
if(particle.position.y particle.position.y = 200;
particle.velocity .y = 0;
}
// 用隨機數更新水平速度分量,並依速度更新位置
particle.velocity.y -= Math.random() * .1;
particle .position.addSelf(
particle.velocity);
}
// 告訴粒子系統我們改變了粒子位置
particleSystem.geometry.__dirtyVertices = true;
// 畫
renderer.render(scene, camera);
// 設定下次呼叫
requestAnimFrame(update);
}
雖然不夠震撼,但這個粒子至少展示瞭如何做。你完全應該自己創造一些美妙的粒子效果,然後讓我知道。
這裡有個警告你應該知道,在幀循環中,我越雷池了:我在一次循環中遍歷了所有粒子,這實際上是種很粗放的方式。如果你的幀循環中做了太多的工作(譯者註:注意幀循環的js代碼是在cpu中運行的,它不像gpu,能一下子並發出成千上萬個簡單進程),瀏覽器就會卡頓,事實上如果你用了requestAnimationFrame,它視圖每秒刷新60次。所以還是優化你的程式碼,在幀循環中做盡量少的事情。 4.小結
粒子效果太棒了,是個人都愛粒子效果,而現在你知道如何在Three.js中加入粒子效果了。我希望你能用得順手,就跟前面一樣! 同樣,這裡有原始碼下載,而且,讓我知道你喜歡它!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。

本文討論了使用瀏覽器開發人員工具的有效JavaScript調試,專注於設置斷點,使用控制台和分析性能。

本文說明瞭如何使用源地圖通過將其映射回原始代碼來調試JAVASCRIPT。它討論了啟用源地圖,設置斷點以及使用Chrome DevTools和WebPack之類的工具。

掌握了入門級TypeScript教程後,您應該能夠在支持TypeScript的IDE中編寫自己的代碼,並將其編譯成JavaScript。本教程將深入探討TypeScript中各種數據類型。 JavaScript擁有七種數據類型:Null、Undefined、Boolean、Number、String、Symbol(ES6引入)和Object。 TypeScript在此基礎上定義了更多類型,本教程將詳細介紹所有這些類型。 Null數據類型 與JavaScript一樣,TypeScript中的null

本文探討了Java收藏框架的有效使用。 它強調根據數據結構,性能需求和線程安全選擇適當的收集(列表,設置,地圖,隊列)。 通過高效優化收集用法

本教程將介紹如何使用 Chart.js 創建餅圖、環形圖和氣泡圖。此前,我們已學習了 Chart.js 的四種圖表類型:折線圖和條形圖(教程二),以及雷達圖和極地區域圖(教程三)。 創建餅圖和環形圖 餅圖和環形圖非常適合展示某個整體被劃分為不同部分的比例。例如,可以使用餅圖展示野生動物園中雄獅、雌獅和幼獅的百分比,或不同候選人在選舉中獲得的投票百分比。 餅圖僅適用於比較單個參數或數據集。需要注意的是,餅圖無法繪製值為零的實體,因為餅圖中扇形的角度取決於數據點的數值大小。這意味著任何占比為零的實體
