17.three官方示例+編輯器+AI快速學習webgl_buffergeometry_lines

本實例主要講解內容

這個Three.js示例展示了如何使用BufferGeometry創建大量線段,并通過**變形目標(Morph Targets)**實現動態變形效果。通過隨機生成的點云數據,結合頂點顏色和變形動畫,創建出一個視覺效果豐富的3D線條場景。

核心技術包括:

  • BufferGeometry的高效使用
  • 頂點顏色的應用
  • 變形目標動畫技術
  • 動態場景性能優化

在這里插入圖片描述

完整代碼注釋

<!DOCTYPE html>
<html lang="en"><head><title>three.js webgl - buffergeometry - lines</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"><link type="text/css" rel="stylesheet" href="main.css"></head><body><div id="container"></div><div id="info"><a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - buffergeometry - lines</div><script type="importmap">{"imports": {"three": "../build/three.module.js","three/addons/": "./jsm/"}}</script><script type="module">import * as THREE from 'three';import { Timer } from 'three/addons/misc/Timer.js';import Stats from 'three/addons/libs/stats.module.js';let container, stats, timer;let camera, scene, renderer;let line;// 線段數量const segments = 10000;// 范圍半徑const r = 800;// 動畫時間變量let t = 0;init();function init() {container = document.getElementById( 'container' );// 初始化相機camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 4000 );camera.position.z = 2750;// 初始化場景scene = new THREE.Scene();// 初始化計時器timer = new Timer();timer.connect( document );// 創建幾何體和材質const geometry = new THREE.BufferGeometry();// 使用頂點顏色的線材質const material = new THREE.LineBasicMaterial( { vertexColors: true } );// 存儲位置和顏色數據const positions = [];const colors = [];// 生成隨機點云數據for ( let i = 0; i < segments; i ++ ) {// 隨機位置const x = Math.random() * r - r / 2;const y = Math.random() * r - r / 2;const z = Math.random() * r - r / 2;// 添加位置數據positions.push( x, y, z );// 添加顏色數據(基于位置歸一化)colors.push( ( x / r ) + 0.5 );colors.push( ( y / r ) + 0.5 );colors.push( ( z / r ) + 0.5 );}// 設置幾何體屬性geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );// 生成變形目標generateMorphTargets( geometry );// 計算邊界球體,用于視錐體剔除geometry.computeBoundingSphere();// 創建線條對象line = new THREE.Line( geometry, material );scene.add( line );// 初始化渲染器renderer = new THREE.WebGLRenderer();renderer.setPixelRatio( window.devicePixelRatio );renderer.setSize( window.innerWidth, window.innerHeight );renderer.setAnimationLoop( animate );container.appendChild( renderer.domElement );// 添加性能統計stats = new Stats();container.appendChild( stats.dom );// 窗口大小變化事件監聽window.addEventListener( 'resize', onWindowResize );}// 窗口大小變化處理函數function onWindowResize() {camera.aspect = window.innerWidth / window.innerHeight;camera.updateProjectionMatrix();renderer.setSize( window.innerWidth, window.innerHeight );}// 動畫循環function animate() {// 更新計時器timer.update();// 獲取時間增量和總時間const delta = timer.getDelta();const time = timer.getElapsed();// 旋轉整個線條對象line.rotation.x = time * 0.25;line.rotation.y = time * 0.5;// 更新變形目標影響因子t += delta * 0.5;line.morphTargetInfluences[ 0 ] = Math.abs( Math.sin( t ) );// 渲染場景renderer.render( scene, camera );// 更新性能統計stats.update();}// 生成變形目標function generateMorphTargets( geometry ) {// 存儲變形目標的位置數據const data = [];// 生成隨機目標位置for ( let i = 0; i < segments; i ++ ) {const x = Math.random() * r - r / 2;const y = Math.random() * r - r / 2;const z = Math.random() * r - r / 2;data.push( x, y, z );}// 創建變形目標屬性const morphTarget = new THREE.Float32BufferAttribute( data, 3 );morphTarget.name = 'target1';// 設置幾何體的變形目標geometry.morphAttributes.position = [ morphTarget ];}</script></body>
</html>

BufferGeometry與變形目標技術解析

BufferGeometry的優勢

BufferGeometry是Three.js中最高效的幾何體表示方式,相比普通Geometry,它有以下優勢:

  1. 內存效率高:以連續數組形式存儲頂點數據,更接近GPU原生格式
  2. 渲染速度快:減少CPU-GPU數據傳輸開銷
  3. 支持大規模場景:能夠處理數百萬個頂點
  4. 靈活的數據組織:可以自定義頂點屬性

在本示例中,我們使用BufferGeometry存儲頂點位置和顏色數據:

const geometry = new THREE.BufferGeometry();// 創建位置和顏色數據數組
const positions = [];
const colors = [];// 填充數據...// 設置幾何體屬性
geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );
geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );
變形目標動畫

變形目標(Morph Targets)是一種基于頂點的動畫技術,通過在不同頂點位置之間插值實現平滑變形效果。主要步驟包括:

  1. 定義基礎幾何體:原始頂點位置
  2. 定義變形目標:一個或多個目標頂點位置
  3. 控制影響因子:通過影響因子控制變形程度(0.0-1.0)

在本示例中,我們實現了一個變形目標:

// 生成變形目標數據
function generateMorphTargets( geometry ) {const data = [];// 生成隨機目標位置...// 創建變形目標屬性const morphTarget = new THREE.Float32BufferAttribute( data, 3 );morphTarget.name = 'target1';// 設置幾何體的變形目標geometry.morphAttributes.position = [ morphTarget ];
}// 在動畫循環中控制變形程度
line.morphTargetInfluences[ 0 ] = Math.abs( Math.sin( t ) );
頂點顏色應用

頂點顏色允許為每個頂點指定不同的顏色,GPU會自動在頂點之間進行插值,產生平滑的漸變效果。使用頂點顏色的步驟:

  1. 材質設置:在材質中啟用vertexColors
  2. 提供顏色數據:為每個頂點提供RGB顏色值

在本示例中:

// 創建啟用頂點顏色的材質
const material = new THREE.LineBasicMaterial( { vertexColors: true } );// 為每個頂點生成顏色數據(基于位置)
colors.push( ( x / r ) + 0.5 );
colors.push( ( y / r ) + 0.5 );
colors.push( ( z / r ) + 0.5 );// 設置幾何體的顏色屬性
geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );
性能優化與應用場景

對于大規模線條渲染的性能優化建議:

  1. 使用BufferGeometry:相比普通Geometry,性能提升顯著
  2. 合并幾何體:如果可能,將多個線條合并為一個
  3. 合理使用變形目標:每個變形目標都會增加內存使用
  4. 控制頂點數量:過多頂點會導致性能下降
  5. 視錐體剔除:確保幾何體有正確的邊界球體

這種技術適合以下場景:

  • 數據可視化(點云、網絡圖等)
  • 粒子系統
  • 動態線條藝術
  • 模擬流體、煙霧等效果

通過結合BufferGeometry、頂點顏色和變形目標,我們可以創建出視覺效果豐富且性能高效的動態線條場景。
交流學習: Three.js 場景編輯器 (Vue3 + TypeScript
實現)
https://threelab.cn/threejs-edit/
在這里插入圖片描述

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

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

相關文章

InfluxDB 2.7 連續查詢實戰指南:Task 替代方案詳解

InfluxDB 2.7 引入了 Task 功能&#xff0c;作為連續查詢&#xff08;CQ&#xff09;的現代替代方案。本文詳細介紹了如何使用 Task 實現傳統 CQ 的功能&#xff0c;包括語法解析、示例代碼、參數對比以及典型應用場景。通過實際案例和最佳實踐&#xff0c;幫助開發者高效遷移并…

Pytorch張量和損失函數

文章目錄 張量張量類型張量例子使用概率分布創建張量正態分布創建張量 (torch.normal)正態分布創建張量示例標準正態分布創建張量標準正態分布創建張量示例均勻分布創建張量均勻分布創建張量示例 激活函數常見激活函數 損失函數(Pytorch API)L1范數損失函數均方誤差損失函數交叉…

大模型在數據分析領域的研究綜述

大模型在業務指標拆解中的應用場景與方法研究 隨著人工智能技術的快速發展&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;在數據分析領域的應用日益廣泛。尤其是在業務指標拆解這一復雜任務中&#xff0c;大模型展現了其獨特的價值和潛力。通過對多維…

JAVA:ResponseBodyEmitter 實現異步流式推送的技術指南

1、簡述 在許多場景下,我們希望后端能夠以流式、實時的方式推送數據給前端,比如消息通知、日志實時展示、進度條更新等。Spring Boot 提供了 ResponseBodyEmitter 機制,可以讓我們在 Controller 中異步地推送數據,從而實現實時流式輸出。 樣例代碼:https://gitee.com/lh…

Spring Boot循環依賴的陷阱與解決方案:如何打破“Bean創建死循環”?

引言 在Spring Boot開發中&#xff0c;你是否遇到過這樣的錯誤信息&#xff1f; The dependencies of some of the beans in the application context form a cycle 這表示你的應用出現了循環依賴。盡管Spring框架通過巧妙的機制解決了部分循環依賴問題&#xff0c;但在實際開…

如何閱讀、學習 Tcc (Tiny C Compiler) 源代碼?如何解析 Tcc 源代碼?

閱讀和解析 TCC&#xff08;Tiny C Compiler&#xff09; 的源代碼需要對編譯器的基本工作原理和代碼結構有一定的了解。以下是分步驟的指南&#xff0c;幫助你更高效地學習和理解 TCC 的源代碼&#xff1a; 1. 前置知識準備 C 語言基礎&#xff1a;TCC 是用 C 語言編寫的&…

Java Set系列集合詳解:HashSet、LinkedHashSet、TreeSet底層原理與使用場景

Java Set系列集合詳解&#xff1a;HashSet、LinkedHashSet、TreeSet底層原理與使用場景 一、Set系列集合概述 1. 核心特點 無序性&#xff1a;存取順序不一致&#xff08;LinkedHashSet除外&#xff09;。唯一性&#xff1a;元素不重復。無索引&#xff1a;無法通過索引直接訪…

解決 CentOS 7 鏡像源無法訪問的問題

在國內使用 CentOS 系統時&#xff0c;經常會遇到鏡像源無法訪問或者下載速度慢的問題。尤其是默認的 CentOS 鏡像源通常是國外的&#xff0c;如果你的網絡環境無法直接訪問國外服務器&#xff0c;就會出現無法下載包的情況。本文將介紹如何修改 CentOS 7 的鏡像源為國內鏡像源…

云計算與大數據進階 | 26、解鎖云架構核心:深度解析可擴展數據庫的5大策略與挑戰(上)

在云應用/服務的 5 層架構里&#xff0c;數據庫服務層穩坐第 4 把交椅&#xff0c;堪稱其中的 “硬核擔當”。它的復雜程度常常讓人望而生畏&#xff0c;不少人都將它視為整個架構中的 “終極挑戰”。 不過&#xff0c;也有人覺得可擴展存儲系統才是最難啃的 “硬骨頭”&#…

Linux——UDP/TCP協議理論

1. UDP協議 1.1 UDP協議格式 系統內的UDP協議結構體&#xff1a; 注1&#xff1a;UDP協議的報頭大小是確定的&#xff0c;為8字節 注2&#xff1a;可以通過報頭中&#xff0c;UDP長度將UDP協議的報頭和有效載荷分離&#xff0c;有效載荷將存儲到接收緩沖區中等待上層解析。 注…

考研復習全年規劃

25考研以330分成功上岸。 備考期間&#xff0c;我深知學習規劃的重要性&#xff0c;為大家精心整理了一份初試備考時間線任務規劃&#xff0c;希望能為正在備考的同學們提供參考。如果你對如何規劃學習路線仍感迷茫&#xff0c;不妨參考這份時間表&#xff0c;合理分配時間&…

PhpStudy | PhpStudy 環境配置 —— PhpStudy 目錄結構 環境變量配置 · Windows 篇

&#x1f31f;想了解這個工具的其它相關筆記&#xff1f;看看這個&#xff1a;[網安工具] 服務器環境配置工具 —— PhpStudy 使用手冊 在前面的章節中&#xff0c;筆者詳細介紹了如何在 Windows 和 Linux 系統中安裝 PhpStudy&#xff0c;但可能會有崽崽在安裝完成后發現依舊…

DDS(數據分發服務) 和 P2P(點對點網絡) 的詳細對比

1. 核心特性對比 維度 DDS P2P 實時性 微秒級延遲&#xff0c;支持硬實時&#xff08;如自動駕駛&#xff09; 毫秒至秒級&#xff0c;依賴網絡環境&#xff08;如文件傳輸&#xff09; 架構 去中心化發布/訂閱模型&#xff0c;節點自主發現 完全去中心化&#xff0c;節…

java中XML的使用

文章目錄 什么是XML特點XML作用XML的編寫語法基本語法特殊字符編寫 約束XML的書寫格式DTD文檔schema文檔屬性命名空間XML命名空間的作用 解析XML的方法??DOM解析XMLDOM介紹DOM解析包&#xff1a;org.w3c.dom常用接口DOM解析包的使用保存XML文件添加DOM節點修改/刪除DOM節點 S…

Spring Boot異步任務失效的8大原因及解決方案

Spring Boot異步任務失效的8大原因及解決方案 摘要:在使用Spring Boot的@Async實現異步任務時,你是否遇到過異步不生效的問題?本文總結了8種常見的異步失效場景,并提供對應的解決方案,幫助你徹底解決異步任務失效的難題。 一、異步失效的常見場景 1. 未啟用異步支持 ? …

QT6 源(104)篇一:閱讀與注釋QAction,其是窗體菜單欄與工具欄里的菜單項,先給出屬性測試,再給出成員函數測試,最后給出信號函數的學習于舉例測試

&#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09;接著給出成員函數測試 &#xff1a; &#xff08;4&#xff09; 給個信號函數的舉例 &#xff1a; &#xff08;5&#xff09; 謝謝

visual studio生成動態庫DLL

visual studio生成動態庫DLL 創建動態庫工程 注意 #include “pch.h” 要放在上面 完成后點擊生成 創建一個控制臺項目 設置項目附加目錄為剛才創建的動態庫工程Dll1&#xff1a; 配置附加庫目錄&#xff1a; 配置動態庫的導入庫&#xff08;.lib&#xff09;&#xff1a;鏈…

matlab多智能體網絡一致性研究

一個基于連續時間多智能體系統&#xff08;Multi-Agent Systems, MAS&#xff09;的一階一致性協議的MATLAB仿真代碼&#xff0c;包含網絡拓撲建模、一致性協議設計和收斂性分析。代碼支持固定拓撲和時變拓撲&#xff0c;適用于學術研究。 1. 基礎模型與代碼框架 (1) 網絡拓撲…

【omnet++】omnet++6.0.3中調用python

版本&#xff1a; omnet 6.0.3 Ubuntu 20.04.6 LTS omnet的installguide中對ubuntu版本是有要求的&#xff0c;找到對應版本下載即可 先安裝omnet再安裝anaconda omnet 6.0.3安裝 別在網上找教程了&#xff0c;官方的installguide手冊是最好的。按照手冊安裝一些依賴包后 so…

【C++】 —— 筆試刷題day_29

一、排序子序列 題目解析 一個數組的連續子序列&#xff0c;如果這個子序列是非遞增或者非遞減的&#xff1b;這個連續的子序列就是排序子序列。 現在給定一個數組&#xff0c;然后然我們判斷這個子序列可以劃分成多少個排序子序列。 例如&#xff1a;1 2 3 2 2 1 可以劃分成 …