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.mzph.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 可以划分成 …