three案例 Three.js波紋效果演示

在這里插入圖片描述
波紋效果,在智慧城市可視化開發中經常用到,這里分享一個比較好玩的案例
以下是詳細的步驟:

初始化部分:設置 Three.js 環境,包括場景、相機、渲染器和控制器
幾何體和紋理:創建平面幾何體并加載波紋紋理
著色器材質:使用自定義著色器實現波紋效果,包括頂點著色器和片段著色器
波紋算法:核心是 circleWave 函數,通過計算距離和時間來生成向外擴散的波紋
顏色混合:根據波紋強度混合兩種顏色,形成視覺層次感
交互控制:使用 GUI 工具允許用戶實時調整波紋顏色
動畫循環:通過不斷更新時間變量來驅動波紋動畫
瀏覽地址:https://aivogenx.github.io/threejs-cesium-webgpu-vue-js/#/codeMirror?navigation=Three.js%E6%A1%88%E4%BE%8B&classify=shader&id=circleWave
代碼

<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Three.js波紋效果演示</title><!-- 這里可以添加CSS樣式文件 -->
</head><body><!-- 導入模塊映射,配置Three.js依賴路徑 --><script type="importmap">{"imports": {"three": "./threejs/build/three.module.js","three/addons/": "./threejs/examples/jsm/"}}</script><script type="module">// 導入Three.js核心庫和輔助工具import * as THREE from 'three'import { OrbitControls } from "three/addons/controls/OrbitControls.js"; import { GUI } from "three/addons/libs/lil-gui.module.min.js";// 獲取渲染容器,使用整個body元素const box = document.body;// 創建Three.js場景,作為所有3D對象的容器const scene = new THREE.Scene()// 創建透視相機,參數依次為:視野角度、寬高比、近裁剪面、遠裁剪面const camera = new THREE.PerspectiveCamera(50, box.clientWidth / box.clientHeight, 0.1, 1000)// 設置相機位置,從(1,1,1)的位置觀察場景camera.position.set(1, 1, 1)// 創建WebGL渲染器,啟用抗鋸齒、透明背景和對數深度緩沖區const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, logarithmicDepthBuffer: true })// 設置渲染器尺寸為容器大小renderer.setSize(box.clientWidth, box.clientHeight)// 將渲染器的DOM元素添加到頁面中box.appendChild(renderer.domElement)// 創建軌道控制器,允許用戶通過鼠標交互旋轉和縮放場景const controls = new OrbitControls(camera, renderer.domElement)// 啟用阻尼效果,使相機移動更平滑controls.enableDamping = true// 窗口大小變化時的響應函數,保持渲染內容適配窗口window.onresize = () => {// 更新渲染器尺寸renderer.setSize(box.clientWidth, box.clientHeight)// 更新相機的寬高比camera.aspect = box.clientWidth / box.clientHeight// 更新相機投影矩陣camera.updateProjectionMatrix()}// 創建平面幾何體,作為波紋效果的載體const geometry = new THREE.PlaneGeometry(2, 2);// 加載波紋紋理,這是實現波紋效果的基礎紋理// 注意:FILE_HOST變量需要在實際使用時替換為真實的資源路徑const texture = new THREE.TextureLoader().load(FILE_HOST + 'images/channels/wave.png')// 設置紋理在水平和垂直方向上重復texture.wrapS = THREE.RepeatWrappingtexture.wrapT = THREE.RepeatWrapping// 創建自定義著色器材質,實現波紋效果的核心部分const material = new THREE.ShaderMaterial({side: THREE.DoubleSide,          // 雙面渲染transparent: true,             // 啟用透明度blending: THREE.AdditiveBlending, // 添加混合模式讓效果更亮uniforms: {uTime: { value: 0.0 },           // 時間變量,控制波紋動畫uScanTex: { value: texture },    // 波紋紋理uScanColor: { value: new THREE.Color(0x00ffff) },    // 主要掃描顏色uScanColorDark: { value: new THREE.Color(0x0088ff) } // 暗部掃描顏色},// 頂點著色器:處理幾何體頂點,傳遞紋理坐標和位置信息給片段著色器vertexShader: `varying vec2 vUv;         // 傳遞給片段著色器的紋理坐標varying vec3 vPosition;   // 傳遞給片段著色器的頂點位置void main() {vUv = uv;vPosition = position;gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);}`,// 片段著色器:計算每個像素的顏色,實現波紋效果的核心邏輯fragmentShader: `// 波紋原點和波紋擴展速度常量#define uScanOrigin vec3(0.0, 0.0, 0.0)#define uScanWaveRatio1 3.2#define uScanWaveRatio2 2.8uniform float uTime;           // 時間變量uniform sampler2D uScanTex;    // 波紋紋理uniform vec3 uScanColor;       // 波紋主顏色uniform vec3 uScanColorDark;   // 波紋暗部顏色varying vec2 vUv;              // 從頂點著色器傳遞的紋理坐標varying vec3 vPosition;        // 從頂點著色器傳遞的頂點位置// 計算圓形波紋效果float circleWave(vec3 p, vec3 origin, float distRatio) {float t = uTime;float dist = distance(p, origin) * distRatio;  // 計算到原點的距離并應用縮放float radialMove = fract(dist - t);            // 創建隨時間移動的波紋float fadeOutMask = 1.0 - smoothstep(1.0, 3.0, dist); // 波紋隨距離衰減radialMove *= fadeOutMask;float cutInitialMask = 1.0 - step(t, dist);    // 控制波紋從中心向外擴展return radialMove * cutInitialMask;}// 根據位置和紋理計算波紋顏色vec3 getScanColor(vec3 worldPos, vec2 uv, vec3 col) {// 從紋理采樣,獲取波紋基礎圖案float scanMask = texture2D(uScanTex, uv).r;// 計算兩種不同速度的波紋效果,形成層次感float cw = circleWave(worldPos, uScanOrigin, uScanWaveRatio1);float cw2 = circleWave(worldPos, uScanOrigin, uScanWaveRatio2);// 為第一種波紋創建遮罩,控制波紋的顯示范圍和強度float mask1 = smoothstep(0.3, 0.0, 1.0 - cw);mask1 *= (1.0 + scanMask * 0.7);  // 結合紋理增強效果// 為第二種波紋創建遮罩float mask2 = smoothstep(0.07, 0.0, 1.0 - cw2) * 0.8;mask1 += mask2;// 創建波紋邊緣高亮效果float mask3 = smoothstep(0.09, 0.0, 1.0 - cw) * 1.5;mask1 += mask3;// 根據遮罩強度混合兩種顏色,形成波紋的顏色變化vec3 scanCol = mix(uScanColorDark, uScanColor, mask1);return scanCol * mask1; // 返回最終的波紋顏色}void main() {vec3 col = vec3(0.0);// 計算波紋顏色,紋理坐標乘以10.0增強波紋密度col = getScanColor(vPosition, vUv * 10.0, col);// 根據顏色強度計算透明度,使波紋邊緣更柔和float alpha = length(col);gl_FragColor = vec4(col, alpha);}`});// 創建網格對象,將幾何體和材質組合,并添加到場景中const mesh = new THREE.Mesh(geometry, material);// 將平面旋轉90度,使其水平放置mesh.rotation.x = Math.PI / 2scene.add(mesh);// 創建圖形界面控制器,允許用戶交互調整參數const gui = new GUI()const params = {uScanColor: '#00ffff',         // 波紋主顏色uScanColorDark: '#0088ff'      // 波紋暗部顏色}// 添加顏色控制器,允許用戶修改波紋主顏色gui.addColor(params, 'uScanColor').onChange((value) => {material.uniforms.uScanColor.value.set(value)})// 添加顏色控制器,允許用戶修改波紋暗部顏色gui.addColor(params, 'uScanColorDark').onChange((value) => {material.uniforms.uScanColorDark.value.set(value)})// 動畫循環函數,驅動整個場景的渲染和更新animate()function animate() {// 請求下一幀動畫requestAnimationFrame(animate)// 更新控制器狀態controls.update()// 渲染場景renderer.render(scene, camera)// 更新時間變量,驅動波紋動畫material.uniforms.uTime.value += 0.005;}</script>
</body></html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88154.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88154.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88154.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Flutter-詳解布局

上一章我們詳細的學習了 Flutter 中的Widget&#xff0c;這一章我們將要學習 Flutter 的布局&#xff0c; 在上一章我們了解到了&#xff1a;Everything is a widget&#xff0c;在 Flutter 中幾乎所有的對象都是一個 Widget &#xff0c;當然也包括布局&#xff0c;Flutter 的…

EPLAN 電氣制圖:建立自己的部件庫,添加部件-加SQL Server安裝教程(三)上

在智能電氣設計領域&#xff0c;EPLAN 作為主流的設計軟件&#xff0c;其部件庫的完善程度直接影響項目設計的效率與質量。本文將從實際操作出發&#xff0c;詳細講解如何在 EPLAN 中建立專屬部件庫并添加部件&#xff0c;為電氣設計奠定堅實基礎。一、部件庫&#xff1a;電氣設…

靜態路由進階實戰全解

一、項目背景二、項目拓撲圖三、設備命名與IP地址規劃設備名接口編號IP地址規劃R1GE0/0192.168.1.1/24GE0/1172.16.1.1/24R2GE0/0192.168.1.2/24GE0/1192.168.2.2/24R3GE0/0192.168.2.3/24GE0/1192.168.3.3/24GE0/2192.168.4.3/24R4GE0/0192.168.3.4/24GE0/1192.168.4.4/24GE0/…

stm32hal模塊驅動(3)ssd1305 oled驅動

SD1305 OLED 驅動芯片詳細介紹SSD1305 是 Solomon Systech 公司生產的一款 OLED 顯示控制器/驅動器&#xff0c;專為 128x64 或 128x32 點陣的 OLED 顯示屏設計。下面我將從多個方面詳細介紹這款驅動芯片。一、SSD1305 基本特性顯示分辨率&#xff1a;最大支持 128 segments 6…

安全為先:如何在 Python 中安全處理數據庫連接與敏感信息

安全為先:如何在 Python 中安全處理數據庫連接與敏感信息 引言:Python 與安全的數據庫交互 自 1991 年誕生以來,Python 憑借其簡潔優雅的語法和強大的生態系統,成為 Web 開發、數據科學、人工智能和數據庫交互的首選語言。作為“膠水語言”,Python 不僅讓開發者能夠快速…

服務器經常出現藍屏是什么原因導致的?如何排查和修復?

服務器出現藍屏&#xff08;BSOD&#xff0c;Blue Screen of Death&#xff09;是一個嚴重的問題&#xff0c;通常表明系統內核或硬件發生了不可恢復的錯誤。藍屏不僅會導致服務器宕機&#xff0c;還可能對業務運行造成重大影響。要有效解決藍屏問題&#xff0c;需要先找到根本…

為什么elementui的<el-table-column label=“名稱“ prop=“name“ label不用寫成:label

在 Vue.js 中&#xff0c;label 和 prop 是 el-table-column 組件的普通屬性&#xff0c;而不是動態綁定的表達式。因此&#xff0c;不需要使用 : 來綁定它們。 1. Vue.js 中的屬性綁定 在 Vue.js 中&#xff0c;屬性綁定有兩種方式&#xff1a; 靜態屬性綁定&#xff1a;直接寫…

分布式光纖傳感:為儲能安全保駕護航

儲能系統是指一種能夠將電能、化學能、動能等形式的能量進行轉化、儲存和釋放的裝置&#xff0c;廣泛應用于可再生能源發電、智能電網、電動車等領域。儲能行業這幾年得到了穩步發展&#xff0c;受到政府機構、行業協會、大型能源企業、電網公司、系統集成商、檢測認證機構等業…

從歷史航拍圖像中去除陰影

在光學遙感中&#xff0c;陰影是影響土地覆蓋制圖精度和分辨率的一個因素&#xff0c;無論是歷史影像&#xff08;黑白影像&#xff09;還是近期影像&#xff08;全彩影像&#xff09;。陰影的產生取決于太陽光照&#xff08;太陽方位角和天頂角&#xff09;、相機視點&#xf…

UE material advance 學習筆記

如何體現輪胎速度的快速感&#xff1a;就是增加一個radial blur&#xff0c;會讓視覺效果感覺輪胎已經轉冒煙了&#xff0c;但是上面兩個輪胎的轉速其實是相同的這種磨砂的感覺&#xff0c;可以用上ditherAA來實現只看法線這一塊&#xff0c;ditherAA就是讓他的表面顏色有大量的…

Vue--2、Vue2 項目配置與組件化開發

一、Vue2 項目環境搭建1. 環境準備安裝 Node.js&#xff1a;推薦使用 nvm 管理多版本 Node# 安裝Node 16.20.2 nvm install 16.20.2 # 切換至指定版本 nvm use 16.20.2 # 驗證安裝 node -v && npm -v安裝 Vue CLI 腳手架&#xff1a;# 國內鏡像源安裝 npm install --re…

虛幻基礎:函數的返回節點

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄函數的返回節點&#xff1a;返回執行后的值返回執行后的值若不執行第一次 返回參數的默認值第二次 返回上一次執行值示例函數的返回節點&#xff1a;返回執行后的值 返回執行后的值 若不執行 第一次 返回參數的默…

FFmpeg 升級指北

近期我參與了部門底層庫依賴的 FFmpeg 從 3.4 升級至 7.0.2 的工作&#xff0c;在此分享一些經驗和遇到的 API 變動。 將 FFmpeg 升級到高版本后&#xff0c;編譯過程中遇到大量報錯是常態。這些錯誤通常源于 API 接口變更或結構體字段調整。此時不必驚慌&#xff0c;核心解決…

RISCV Linux 虛擬內存精講系列三 -- setup_vm()

在 Linux 使用虛擬地址前&#xff0c;需要先配置頁表&#xff0c;這就是 setup_vm() 的作用。然而&#xff0c;Linux 的頁表配置&#xff0c;并不是一次過完成的&#xff0c;分了兩個階段&#xff0c;如下&#xff1a;在 setup_vm() 中&#xff0c;主要初始化了&#xff1a;1. …

創客匠人:解析創始人 IP 打造的底層邏輯與知識變現路徑

在數字經濟時代&#xff0c;創始人 IP 的價值被不斷放大&#xff0c;而知識變現作為 IP 商業閉環的核心環節&#xff0c;正成為無數創業者探索的方向。創客匠人深耕知識付費領域多年&#xff0c;見證了大量創始人從 0 到 1 打造 IP 并實現變現的全過程&#xff0c;其背后的邏輯…

Visual Studio 2022 MFC Dialog 添加Toolbar及Tips提示

主要步驟&#xff1a;在主框架類中添加消息處理函數聲明在 OnCreate 函數中啟用工具欄提示在消息映射中注冊 TTN_NEEDTEXT 消息使用 OnToolTipText 函數實現自定義提示文本1.在主程序的.h文件中加入afx_msg BOOL OnToolTipText(UINT id, NMHDR* pNMHDR, LRESULT* pResult); 2.在…

2025Q2大模型更新匯總(大語言模型篇)

摘要 2025年Q2大語言模型更新匯總&#xff1a; Qwen3&#xff0c;Deepseek-R1-0528&#xff0c;Doubao-Seed-1.6, MiniMax-M1, GPT4.1/O3/O4&#xff0c;Claude4/Gemini2.5 Qwen3 ? 開源MOE模型&#xff0c; ? MOE模型&#xff1a;Qwen3-235B-A22B&#xff0c;Qwen3-30B-…

【STM32】定時器中斷 + 含常用寄存器和庫函數配置(提供完整實例代碼)

通用定時器基礎知識 參考資料:STM32F1xx官方資料:《STM32中文參考手冊V10》-第14章通用定時器 通用定時器工作過程: 時鐘選擇 計數器時鐘可以由下列時鐘源提供: ① 內部時鐘(CK_INT) ② 外部時鐘模式1:外部輸入腳(TIx) ③ 外部時鐘模式2:外部觸發輸入(ETR) ④ 內部觸…

集群Redis

文章目錄前言一、Redis主從復制配置1.1.配置文件redis_master.conf,redis_slave.conf1.2.啟動服務1.3.檢查成果二、Redis集群配置2.1.服務器40.240.34.91集群配置2.2.其它服務器xxx.92,xxx.93集群配置2.3.啟動服務2.3.啟動集群服務2.4.檢查成果三、優劣四、結束前言 提示&…

ORA-600 kokiasg1故障分析---惜分飛

故障總結:客戶正常關閉數據庫,然后啟動報ORA-600 kokiasg1錯誤,通過對啟動分析確認是由于IDGEN1$序列丟失導致,修復該故障之后,數據庫啟動成功,但是后臺大量報ORA-600 12803,ORA-600 15264等錯誤,業務用戶無法登錄.經過深入分析,發現數據庫字典obj$中所有核心字典的序列全部被刪…