`THREE.BufferGeometry` 是 Three.js 中一个强大的类,用于表示几何体数据。

news2024/11/15 0:00:06

demo案例

在这里插入图片描述

THREE.BufferGeometry 是 Three.js 中一个强大的类,用于表示几何体数据。与传统的 THREE.Geometry 类相比,它使用缓冲区来存储顶点数据,从而在性能上有显著的提升。以下是 THREE.BufferGeometry 的详细说明,包括其输入参数、输出结果、属性和方法。

创建实例

const geometry = new THREE.BufferGeometry();

属性

BufferGeometry 的主要属性有:

  • attributes: 存储几何体顶点属性的对象。例如,顶点位置、法线、颜色等。
  • index: 用于定义顶点索引的属性,可以用于减少顶点重复。
  • groups: 一个数组,用于定义几何体的多个子集。
  • boundingBox: 几何体的轴对齐边界框(THREE.Box3 对象)。
  • boundingSphere: 几何体的边界球(THREE.Sphere 对象)。
  • drawRange: 一个对象,定义绘制的起始点和数量。
  • userData: 一个可用于存储任意数据的对象。

方法

BufferGeometry 提供了丰富的方法,用于操作几何体数据:

  • addAttribute: 添加或更新属性。自 Three.js r125 版本起已废弃,推荐使用 setAttribute

    geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
    
  • setIndex: 设置顶点索引。

    geometry.setIndex(indices);
    
  • setAttribute: 添加或更新属性。

    geometry.setAttribute('color', new THREE.Float32BufferAttribute(colors, 3));
    
  • getAttribute: 获取属性。

    const positions = geometry.getAttribute('position');
    
  • deleteAttribute: 删除属性。

    geometry.deleteAttribute('position');
    
  • applyMatrix4: 将几何体应用一个矩阵变换。

    geometry.applyMatrix4(matrix);
    
  • computeBoundingBox: 计算并更新 boundingBox 属性。

    geometry.computeBoundingBox();
    
  • computeBoundingSphere: 计算并更新 boundingSphere 属性。

    geometry.computeBoundingSphere();
    
  • computeVertexNormals: 计算并更新顶点法线。

    geometry.computeVertexNormals();
    
  • normalizeNormals: 规范化法线。

    geometry.normalizeNormals();
    
  • toNonIndexed: 将几何体转换为非索引形式。

    geometry.toNonIndexed();
    
  • clone: 克隆几何体。

    const clonedGeometry = geometry.clone();
    
  • copy: 从另一个几何体复制数据。

    const newGeometry = new THREE.BufferGeometry().copy(geometry);
    
  • dispose: 释放几何体相关的内存。

    geometry.dispose();
    
  • merge: 合并两个几何体。

    geometry.merge(geometry2);
    
  • setDrawRange: 设置绘制范围。

    geometry.setDrawRange(start, count);
    

示例

以下是一个完整示例,展示如何使用 THREE.BufferGeometry 创建一个简单的几何体并将其添加到场景中:

import * as THREE from 'three';

// 创建场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 定义顶点位置
const vertices = new Float32Array([
  -1.0, -1.0,  1.0,
   1.0, -1.0,  1.0,
   1.0,  1.0,  1.0,
  -1.0,  1.0,  1.0,
  -1.0, -1.0, -1.0,
   1.0, -1.0, -1.0,
   1.0,  1.0, -1.0,
  -1.0,  1.0, -1.0
]);

// 定义顶点索引
const indices = [
  0, 1, 2, 0, 2, 3,
  4, 5, 6, 4, 6, 7,
  0, 1, 5, 0, 5, 4,
  1, 2, 6, 1, 6, 5,
  2, 3, 7, 2, 7, 6,
  3, 0, 4, 3, 4, 7
];

// 创建 BufferGeometry 并设置属性
const geometry = new THREE.BufferGeometry();
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
geometry.setIndex(indices);

// 创建材质和网格
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: true });
const mesh = new THREE.Mesh(geometry, material);

// 将网格添加到场景中
scene.add(mesh);

// 设置相机位置
camera.position.z = 5;

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
  renderer.render(scene, camera);
}
animate();

总结

THREE.BufferGeometry 是一个强大的类,允许高效地处理几何体数据。它通过使用缓冲区存储顶点数据,提供了高性能的几何体处理方式。通过其丰富的方法和属性,可以方便地操作和变换几何体数据。

<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - buffer geometry custom attributes - particles</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 custom attributes - particles</div>

		<!-- 顶点着色器 -->
		<script type="x-shader/x-vertex" id="vertexshader">

			attribute float size;

			varying vec3 vColor;

			void main() {

				vColor = color;

				vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

				gl_PointSize = size * ( 300.0 / -mvPosition.z );

				gl_Position = projectionMatrix * mvPosition;

			}

		</script>

		<!-- 片段着色器 -->
		<script type="x-shader/x-fragment" id="fragmentshader">

			uniform sampler2D pointTexture;

			varying vec3 vColor;

			void main() {

				gl_FragColor = vec4( vColor, 1.0 );

				gl_FragColor = gl_FragColor * texture2D( pointTexture, gl_PointCoord );

			}

		</script>

		<script type="importmap">
			{
				"imports": {
					"three": "../build/three.module.js",
					"three/addons/": "./jsm/"
				}
			}
		</script>

		<script type="module">

			import * as THREE from 'three';
			import Stats from 'three/addons/libs/stats.module.js';

			let renderer, scene, camera, stats;
			let particleSystem, uniforms, geometry;
			const particles = 100000; // 粒子数量

			init(); // 初始化
			animate(); // 动画循环

			function init() {

				// 创建相机
				camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
				camera.position.z = 300;

				// 创建场景
				scene = new THREE.Scene();

				// 定义 uniforms 变量
				uniforms = {
					pointTexture: { value: new THREE.TextureLoader().load( 'textures/sprites/spark1.png' ) }
				};

				// 创建着色器材质
				const shaderMaterial = new THREE.ShaderMaterial( {
					uniforms: uniforms,
					vertexShader: document.getElementById( 'vertexshader' ).textContent,
					fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
					blending: THREE.AdditiveBlending,
					depthTest: false,
					transparent: true,
					vertexColors: true
				} );

				const radius = 200; // 粒子分布半径
				geometry = new THREE.BufferGeometry();
				const positions = [];
				const colors = [];
				const sizes = [];
				const color = new THREE.Color();

				for ( let i = 0; i < particles; i ++ ) {

					// 随机生成粒子的位置
					positions.push( ( Math.random() * 2 - 1 ) * radius );
					positions.push( ( Math.random() * 2 - 1 ) * radius );
					positions.push( ( Math.random() * 2 - 1 ) * radius );

					// 设置粒子的颜色
					color.setHSL( i / particles, 1.0, 0.5 );
					colors.push( color.r, color.g, color.b );

					// 设置粒子的初始大小
					sizes.push( 20 );

				}

				// 将属性添加到几何体中
				geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );
				geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colors, 3 ) );
				geometry.setAttribute( 'size', new THREE.Float32BufferAttribute( sizes, 1 ).setUsage( THREE.DynamicDrawUsage ) );

				// 创建粒子系统
				particleSystem = new THREE.Points( geometry, shaderMaterial );
				scene.add( particleSystem );

				// 创建渲染器
				renderer = new THREE.WebGLRenderer();
				renderer.setPixelRatio( window.devicePixelRatio );
				renderer.setSize( window.innerWidth, window.innerHeight );

				const container = document.getElementById( 'container' );
				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() {

				// 请求下一帧并渲染
				requestAnimationFrame( animate );
				render();
				stats.update();

			}

			function render() {

				const time = Date.now() * 0.005; // 获取当前时间

				particleSystem.rotation.z = 0.01 * time; // 旋转粒子系统

				const sizes = geometry.attributes.size.array;

				// 动态更新粒子大小
				for ( let i = 0; i < particles; i ++ ) {
					sizes[ i ] = 10 * ( 1 + Math.sin( 0.1 * i + time ) );
				}

				geometry.attributes.size.needsUpdate = true; // 标记属性需要更新
				renderer.render( scene, camera ); // 渲染场景

			}

		</script>

</body>
</html>

压图地址

image.png

一个功能强大的图片处理工具,它可以满足用户对于图片压缩、格式转换、质量调节以及长图片分割等多种需求。

【轻松压缩,一键搞定】您的图片处理神器来了!

压图地址

本内容来源于小豆包,想要更多内容请跳转小豆包 》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1789249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARM服务器在云手机中可以提供哪些支持

ARM服务器作为云手机的底层支撑&#xff0c;在很多社媒APP或者电商APP平台都有着很多看不见的功劳&#xff0c;可以说ARM扮演着至关重要的底层支持角色&#xff1b; 首先&#xff0c;ARM 服务器为云手机提供了强大的计算能力基础。云手机需要处理大量的数据和复杂的运算&#x…

Sentinel不使用控制台基于注解限流,热点参数限流

目录 一、maven依赖 二、控制台 三、基于注解限流 四、热点参数限流 五、使用JMeter验证 一、maven依赖 需要注意&#xff0c;使用的版本需要和你的SpringBoot版本匹配&#xff01;&#xff01; Spring-Cloud直接添加如下依赖即可&#xff0c;baba已经帮你指定好版本了。…

沃尔玛、美客多跨境平台自养号全攻略:防关联环境系统搭建与养号技巧

在沃尔玛、美客多等跨境平台进行自养号的过程中&#xff0c;环境系统的选择和账号的养育是至关重要的。以下是我对这两个方面的经验和技巧的总结&#xff1a; 环境系统&#xff1a; 市面上有很多环境系统可供选择&#xff0c;但质量参差不齐。为了实现足够高的伪装度&#xff…

服务器数据恢复—raid5阵列上分配的卷被删除后重建如何恢复被删除卷的数据?

服务器存储数据恢复环境&#xff1a; 某品牌FlexStorage P5730服务器存储&#xff0c;存储中有一组由24块硬盘组建的RAID5阵列&#xff0c;包括1块热备硬盘。 服务器存储故障&#xff1a; 存储中的2个卷被删除&#xff0c;删除之后重建了一个新卷。需要恢复之前删除的一个卷的数…

高舒适性气膜网球馆的注意事项—轻空间

气膜网球馆以其高舒适性、智能恒温等特点&#xff0c;成为现代体育场馆的新宠。在国家提倡全民健身的背景下&#xff0c;各地气膜网球馆如雨后春笋般涌现。然而&#xff0c;在建设和使用气膜网球馆时&#xff0c;需要特别注意以下几点&#xff1a; 1. 避免随意拆装 气膜网球馆…

Three.js——tween动画、光线投射拾取、加载.obj/.mtl外部文件、使用相机控制器

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…

[数据集][目标检测]剪刀石头布检测数据集VOC+YOLO格式1973张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;1973 标注数量(xml文件个数)&#xff1a;1973 标注数量(txt文件个数)&#xff1a;1973 标注…

SpringBoot接口防抖(防重复提交)

SpringBoot接口防抖&#xff08;防重复提交&#xff09; 概念 Spring Boot接口防抖&#xff08;Debouncing&#xff09;的概念是指在处理请求时&#xff0c;通过一定的机制来防止用户频繁触发同一接口请求&#xff0c;以防止重复提交或频繁请求的情况发生。 在Web应用中&…

Jupyter Notebook 切换虚拟环境

具体流程&#xff1a; 1. 查看当前jupyter notebook的环境&#xff1a; 从上面可看出当前jupyter只有一个python 3的环境。 2、 在终端中切换至想要添加的环境&#xff1a; 2.1 激活你要添加的环境 conda activate sf 2.2 在当前环境中安装ipykernel conda install ipyke…

手把手教你【如何使用Vue3+Spring Boot实现一个视频点播功能】

一、简介 本项目是一个实际的视频点播应用&#xff0c;采用了Vue3和Spring Boot作为主要技术栈。旨在帮助开发者通过学习和参考实现思路来掌握相关知识。它主要解决了阿里云视频点播服务的接入、视频基础信息管理以及上传视频后获取视频ID等关键流程&#xff0c;涉及前后端交互…

【最新支持】OpenCV实验大师C++ SDK支持YOLOv10了推理了

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; OpenCV实验大师C SDK YOLO系列模型推理SDK 支持 YOLOv5、YOLOv8、YOLOv10系列网络从推理与部署 基于OpenCV DNN 与OpenVINO实…

Echarts 在指定部分做文字标记

文章目录 需求分析1. demo12. demo22. demo3 定位解决需求 实现在Echarts的折线图中,相同Y值的两点之间显示’abc’ 分析 1. demo1 使用 ECharts 的 markLine 功能来在相邻两个点之间添加标记。其中,我们通过设置标记的 yAxis 和 label 来控制标记的位置和显示内容。最后…

前端 CSS 经典:3D Hover Effect 效果

前言&#xff1a;有趣的 3D Hover Effect 效果&#xff0c;通过 js 监听鼠标移动&#xff0c;动态赋值 rotateX&#xff0c;rotateY 的旋转度来实现。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta …

【NoSQL数据库】Redis简介

Redis Redis简介 Redis关系型数据库和非关系型数据库Redis 简介redis速度快的原因 Redis 配置Linux 源码安装redis命令工具 关系型数据库和非关系型数据库 关系型数据库&#xff08;Relational Database&#xff09;和非关系型数据库&#xff08;Non-Relational Database&…

在仓库新建分支之后,Vscode里面看不到

问题描述 在仓库新建了分支 但是在Vscode里面看不到这个新建的分支 解决 参考文章&#xff1a;http://t.csdnimg.cn/V92a3 在终端输入&#xff1a;git remote update origin --prune 命令解释 git remote update origin --prune 是一个 Git 命令&#xff0c;用于更新远程…

小猪APP分发:让APP封装变得如此简单

你是否曾经在开发完一款APP后&#xff0c;为了封装、分发而头疼不已&#xff1f;别担心&#xff0c;小猪APP分发来拯救你了&#xff01;这款神器不仅能让你的工作变得更加高效&#xff0c;还能让你的APP在各大平台上顺利分发。 小猪APP封装www.ppzhu.net APP封装的挑战 开发一…

Python3.9及以上Pyinstaller 反编译教程(exe转py)

文章目录 前言1.使用pyinstxtractor.py将exe文件转换成pyc文件2.给pyc文件添加文件头3.使用pycdc工具反编译pyc文件&#xff0c;获得源码 前言 经常使用pyinstaller将一些写的python程序打包成了各种exe&#xff0c;时间一长&#xff0c;源码丢失&#xff0c;为了恢复一部分源…

学习Python我能做些什么了?你真的了解了嘛?

工欲善其事&#xff0c;必先利其器。学习不是盲目的&#xff0c;是有目标性的。所以&#xff0c;在学习之前充分了解自己所学技能的前景&#xff0c;学完能做什么&#xff0c;大概地薪资待遇是很有必要的。 Python作为人工智能的重要编程语言&#xff0c;无论发展前景还是就业…

【文末附gpt升级秘笈】Suno全新功能在音乐创作领域的应用与影响

Suno全新功能在音乐创作领域的应用与影响 摘要&#xff1a; 随着科技的飞速发展&#xff0c;人工智能与音乐创作的结合日益紧密。本文旨在探讨Suno全新功能——即兴哼唱创作与声音模仿——在音乐创作领域的应用与影响。通过深入分析这一技术的原理、特点及其在音乐创作中的实际…

Linux 系统怎么快速「批量重命名」文件

如果需要对文件批量重命名&#xff0c;怎么办&#xff0c;是不是要找个工具&#xff0c;下载看这么使用。其实在 Linux、macOS 系统上使用脚本可以轻松搞定。 如&#xff0c;这里有一批图片文件&#xff0c;后缀名可能是jpg、jpeg、png 等&#xff0c;名称如 “我是待重命名的…