THREE.Points
是 Three.js 中用于创建粒子系统的一种对象。它是 THREE.Object3D
的子类。以下是 THREE.Points
的构造函数参数、输出、方法和属性的详细说明:
构造函数
new THREE.Points(geometry, material)
参数
-
geometry:
THREE.BufferGeometry
- 定义粒子系统的几何形状和顶点数据。
-
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
的所有方法,并增加了一些特有的方法:
- raycast(raycaster, intersects)
- 用于检测射线和粒子系统的交点。
示例
const raycaster = new THREE.Raycaster();
const intersects = [];
points.raycast(raycaster, intersects);
属性
THREE.Points
继承了 THREE.Object3D
的所有属性,并增加了一些特有的属性:
-
geometry:
THREE.BufferGeometry
- 存储粒子系统的几何数据。
-
material:
THREE.Material | THREE.Material[]
- 存储粒子系统的材质数据。
-
isPoints:
boolean
- 标识对象是否为
THREE.Points
对象。对于THREE.Points
对象,该属性始终为true
。
- 标识对象是否为
-
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>