`THREE.Points` 是 Three.js 中用于创建点,粒子系统的一种对象

demo案例

在这里插入图片描述

THREE.Points 是 Three.js 中用于创建粒子系统的一种对象。它是 THREE.Object3D 的子类。以下是 THREE.Points 的构造函数参数、输出、方法和属性的详细说明:

构造函数

new THREE.Points(geometry, material)
参数
  1. geometry: THREE.BufferGeometry

    • 定义粒子系统的几何形状和顶点数据。
  2. material: THREE.PointsMaterial 或者其他材质类型

    • 定义粒子系统的材质和外观。
示例
const geometry = new THREE.BufferGeometry();
const material = new THREE.PointsMaterial({ color: 0x888888 });
const points = new THREE.Points(geometry, material);

输出

  • THREE.Points 对象:一个包含给定几何体和材质的粒子系统对象。

方法

THREE.Points 继承了 THREE.Object3D 的所有方法,并增加了一些特有的方法:

  1. raycast(raycaster, intersects)
    • 用于检测射线和粒子系统的交点。
示例
const raycaster = new THREE.Raycaster();
const intersects = [];
points.raycast(raycaster, intersects);

属性

THREE.Points 继承了 THREE.Object3D 的所有属性,并增加了一些特有的属性:

  1. geometry: THREE.BufferGeometry

    • 存储粒子系统的几何数据。
  2. material: THREE.Material | THREE.Material[]

    • 存储粒子系统的材质数据。
  3. isPoints: boolean

    • 标识对象是否为 THREE.Points 对象。对于 THREE.Points 对象,该属性始终为 true
  4. type: string

    • 对象的类型,默认为 "Points"
示例
console.log(points.geometry);  // 输出粒子系统的几何数据
console.log(points.material);  // 输出粒子系统的材质数据
console.log(points.isPoints);  // 输出 true
console.log(points.type);      // 输出 "Points"

继承自 THREE.Object3D 的方法和属性

THREE.Points 继承了 THREE.Object3D 的所有方法和属性。例如:

  • position: THREE.Vector3
  • rotation: THREE.Euler
  • scale: THREE.Vector3
  • add(object)
  • remove(object)
  • updateMatrix()

这些方法和属性可以用来操作和控制粒子系统的位置、旋转、缩放等。

示例
points.position.set(0, 0, 0);
points.rotation.x = Math.PI / 4;
points.scale.set(2, 2, 2);
scene.add(points);
<!DOCTYPE html>
<html lang="en">
	<head>
		<title>three.js webgl - buffergeometry - 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 - particles</div>

		<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 container, stats;

			let camera, scene, renderer;

			let points;

			init();
			animate();

			function init() {

				container = document.getElementById( 'container' );

				// 创建相机
				camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 5, 3500 );
				camera.position.z = 2750;

				// 创建场景
				scene = new THREE.Scene();
				scene.background = new THREE.Color( 0x050505 );
				scene.fog = new THREE.Fog( 0x050505, 2000, 3500 );

				// 创建粒子数量
				const particles = 500000;

				// 创建几何体
				const geometry = new THREE.BufferGeometry();

				// 创建通用缓冲区(二进制数据,每个粒子占16字节)
				const arrayBuffer = new ArrayBuffer( particles * 16 );

				// 以下类型数组共享相同的缓冲区
				const interleavedFloat32Buffer = new Float32Array( arrayBuffer );
				const interleavedUint8Buffer = new Uint8Array( arrayBuffer );

				const color = new THREE.Color();

				const n = 1000, n2 = n / 2; // 粒子分布在立方体中

				for ( let i = 0; i < interleavedFloat32Buffer.length; i += 4 ) {

					// 位置(前12字节)
					const x = Math.random() * n - n2;
					const y = Math.random() * n - n2;
					const z = Math.random() * n - n2;

					interleavedFloat32Buffer[ i + 0 ] = x;
					interleavedFloat32Buffer[ i + 1 ] = y;
					interleavedFloat32Buffer[ i + 2 ] = z;

					// 颜色(最后4字节)
					const vx = ( x / n ) + 0.5;
					const vy = ( y / n ) + 0.5;
					const vz = ( z / n ) + 0.5;

					color.setRGB( vx, vy, vz, THREE.SRGBColorSpace );

					const j = ( i + 3 ) * 4;

					interleavedUint8Buffer[ j + 0 ] = color.r * 255;
					interleavedUint8Buffer[ j + 1 ] = color.g * 255;
					interleavedUint8Buffer[ j + 2 ] = color.b * 255;
					interleavedUint8Buffer[ j + 3 ] = 0; // 不需要

				}

				const interleavedBuffer32 = new THREE.InterleavedBuffer( interleavedFloat32Buffer, 4 );
				const interleavedBuffer8 = new THREE.InterleavedBuffer( interleavedUint8Buffer, 16 );

				geometry.setAttribute( 'position', new THREE.InterleavedBufferAttribute( interleavedBuffer32, 3, 0, false ) );
				geometry.setAttribute( 'color', new THREE.InterleavedBufferAttribute( interleavedBuffer8, 3, 12, true ) );

				// 创建材质
				const material = new THREE.PointsMaterial( { size: 15, vertexColors: true } );

				// 创建点云
				points = new THREE.Points( geometry, material );
				scene.add( points );

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

				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.001;

				points.rotation.x = time * 0.25;
				points.rotation.y = time * 0.5;

				renderer.render( scene, camera );

			}

		</script>

	</body>
</html>

压图地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小豆包3D世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值