demo案例
THREE.PointsMaterial
是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。
构造函数
const material = new THREE.PointsMaterial(parameters);
参数(parameters)
parameters
是一个对象,用于初始化材质的各种属性。常用参数包括:
-
color:
THREE.Color | string | number
粒子的颜色。例如:new THREE.Color(0xffffff)
或者0xffffff
。 -
map:
THREE.Texture
用于每个粒子的纹理贴图。 -
size:
number
粒子的大小,默认值是1
。 -
sizeAttenuation:
boolean
粒子的大小是否随相机深度衰减,默认值是true
。 -
vertexColors:
boolean
是否使用顶点颜色,默认值是false
。 -
opacity:
number
材质的不透明度,范围是0.0
到1.0
,默认值是1.0
。 -
transparent:
boolean
是否使用透明度,默认值是false
。 -
alphaTest:
number
透明度测试的阈值,范围是0.0
到1.0
,默认值是0
。 -
blending:
THREE.Blending
材质的混合模式,默认值是THREE.NormalBlending
。 -
depthTest:
boolean
是否进行深度测试,默认值是true
。 -
depthWrite:
boolean
是否进行深度写入,默认值是true
。
属性
-
color:
THREE.Color
粒子的颜色,默认值是new THREE.Color(0xffffff)
。 -
map:
THREE.Texture | null
用于每个粒子的纹理贴图,默认值是null
。 -
size:
number
粒子的大小,默认值是1
。 -
sizeAttenuation:
boolean
粒子的大小是否随相机深度衰减,默认值是true
。 -
vertexColors:
boolean
是否使用顶点颜色,默认值是false
。 -
opacity:
number
材质的不透明度,范围是0.0
到1.0
,默认值是1.0
。 -
transparent:
boolean
是否使用透明度,默认值是false
。 -
alphaTest:
number
透明度测试的阈值,范围是0.0
到1.0
,默认值是0
。 -
blending:
THREE.Blending
材质的混合模式,默认值是THREE.NormalBlending
。 -
depthTest:
boolean
是否进行深度测试,默认值是true
。 -
depthWrite:
boolean
是否进行深度写入,默认值是true
。
方法
THREE.PointsMaterial
继承了 THREE.Material
的所有方法。常用的方法包括:
-
clone()
创建一个材质的副本。const clonedMaterial = material.clone();
-
copy(source)
从另一个材质复制属性。material.copy(otherMaterial);
-
dispose()
释放材质占用的内存。当材质不再需要时应该调用此方法。material.dispose();
-
setValues(parameters)
设置材质的属性。parameters
对象的属性名称和THREE.PointsMaterial
的构造函数参数相同。material.setValues({ color: 0xff0000, size: 2 });
示例
下面是一个使用 THREE.PointsMaterial
创建粒子系统的示例:
import * as THREE from 'three';
// 创建场景
const scene = new THREE.Scene();
// 创建相机
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
camera.position.z = 5;
// 创建渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 创建粒子几何体
const geometry = new THREE.BufferGeometry();
const vertices = [];
for (let i = 0; i < 10000; i++) {
const x = THREE.MathUtils.randFloatSpread(2000);
const y = THREE.MathUtils.randFloatSpread(2000);
const z = THREE.MathUtils.randFloatSpread(2000);
vertices.push(x, y, z);
}
geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));
// 创建粒子材质
const material = new THREE.PointsMaterial({
color: 0x888888,
size: 1,
sizeAttenuation: true,
transparent: true,
opacity: 0.75
});
// 创建粒子系统
const particles = new THREE.Points(geometry, material);
scene.add(particles);
// 渲染循环
function animate() {
requestAnimationFrame(animate);
particles.rotation.x += 0.001;
particles.rotation.y += 0.002;
renderer.render(scene, camera);
}
animate();
这个示例创建了一个简单的粒子系统,粒子随机分布在一个立方体区域内,并且粒子材质设置为半透明的灰色。
<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js webgl - buffergeometry - custom VBOs</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 VBOs</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;
const particles = 300000; // 粒子数量
let drawCount = 10000; // 绘制的初始粒子数量
init();
animate();
function init() {
container = document.getElementById('container');
// 初始化渲染器
renderer = new THREE.WebGLRenderer({ antialias: false });
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
// 初始化相机
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);
// 创建 BufferGeometry
const geometry = new THREE.BufferGeometry();
const positions = [];
const positions2 = [];
const colors = [];
const color = new THREE.Color();
const n = 1000, n2 = n / 2; // 粒子在立方体中的分布范围
for (let i = 0; i < particles; i++) {
// 随机生成粒子的位置
const x = Math.random() * n - n2;
const y = Math.random() * n - n2;
const z = Math.random() * n - n2;
positions.push(x, y, z);
positions2.push(z * 0.3, x * 0.3, y * 0.3);
// 根据位置生成颜色
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);
colors.push(color.r, color.g, color.b);
}
// 获取 WebGL 上下文
const gl = renderer.getContext();
// 创建并绑定第一个位置缓冲区
const pos = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, pos);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions), gl.STATIC_DRAW);
// 创建并绑定第二个位置缓冲区
const pos2 = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, pos2);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(positions2), gl.STATIC_DRAW);
// 创建并绑定颜色缓冲区
const rgb = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, rgb);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
// 将缓冲区数据转换为 GLBufferAttribute 并设置到几何体属性中
const posAttr1 = new THREE.GLBufferAttribute(pos, gl.FLOAT, 3, 4, particles);
const posAttr2 = new THREE.GLBufferAttribute(pos2, gl.FLOAT, 3, 4, particles);
geometry.setAttribute('position', posAttr1);
// 每隔两秒切换位置属性
setInterval(function () {
const attr = geometry.getAttribute('position');
geometry.setAttribute('position', (attr === posAttr1) ? posAttr2 : posAttr1);
}, 2000);
geometry.setAttribute('color', new THREE.GLBufferAttribute(rgb, gl.FLOAT, 3, 4, particles));
// 创建粒子材质
const material = new THREE.PointsMaterial({ size: 15, vertexColors: true });
// 创建粒子系统并添加到场景中
points = new THREE.Points(geometry, material);
points.frustumCulled = false; // 关闭视锥体剔除
scene.add(points);
// 初始化统计信息
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() {
drawCount = (Math.max(5000, drawCount) + Math.floor(500 * Math.random())) % particles;
points.geometry.setDrawRange(0, drawCount);
const time = Date.now() * 0.001;
points.rotation.x = time * 0.1;
points.rotation.y = time * 0.2;
renderer.render(scene, camera);
}
</script>
</body>
</html>
主要功能说明
-
初始化 Three.js 渲染器、相机和场景:
- 创建并设置渲染器和相机。
- 将渲染器的 DOM 元素添加到 HTML 容器中。
- 设置场景背景和雾效果。
-
创建 BufferGeometry:
- 生成粒子的位置和颜色数据。
- 将这些数据绑定到 WebGL 缓冲区。
- 将这些缓冲区转换为
GLBufferAttribute
并设置为几何体的属性。
-
设置粒子系统和材质:
- 使用
PointsMaterial
创建粒子材质。 - 将材质和几何体结合成
Points
对象,并添加到场景中。
- 使用
-
动画和渲染循环:
- 通过
requestAnimationFrame
实现动画循环。 - 在每一帧中更新粒子系统的旋转,并调用渲染器渲染场景。
- 通过
-
窗口调整处理:
- 监听窗口大小变化事件,调整相机和渲染器的尺寸。
压图地址
一个功能强大的图片处理工具,它可以满足用户对于图片压缩、格式转换、质量调节以及长图片分割等多种需求。
【轻松压缩,一键搞定】您的图片处理神器来了!
压图地址
🎉 您是否曾为图片太大无法上传而烦恼?是否为图片格式不兼容而头疼?现在,有了我们的图片处理工具,这些问题将不复存在!
🌟 功能亮点:
批量压缩:无论您有多少张图片,无论尺寸大小,我们的工具都能一次性处理,让您的工作效率翻倍!
格式转换:支持多种图片格式之间的轻松转换,满足您在不同场景下的使用需求。
压缩质量可调:想要保留更多细节?还是追求更小的文件大小?压缩质量由您说了算!
长图片分割:再也不用担心长图无法完整显示或处理了,我们的工具能轻松将长图分割成多张图片,方便您进行后续编辑和分享。
获取网络图片:可将网络路径图片路径,转化成自己的图片进行处理下载,支持批量转换图片下载
📷 无论是从相机导出的大图,还是手机拍摄的生活照,我们的工具都能轻松应对,让您的图片处理变得简单又高效!
💡
压图地址