您的位置:首页 > 新闻 > 会展 > `THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

2024/10/9 11:42:36 来源:https://blog.csdn.net/qq_37030315/article/details/139854498  浏览:    关键词:`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

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.01.0,默认值是 1.0

  • transparent: boolean
    是否使用透明度,默认值是 false

  • alphaTest: number
    透明度测试的阈值,范围是 0.01.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.01.0,默认值是 1.0

  • transparent: boolean
    是否使用透明度,默认值是 false

  • alphaTest: number
    透明度测试的阈值,范围是 0.01.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);// 创建 BufferGeometryconst 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>

主要功能说明

  1. 初始化 Three.js 渲染器、相机和场景

    • 创建并设置渲染器和相机。
    • 将渲染器的 DOM 元素添加到 HTML 容器中。
    • 设置场景背景和雾效果。
  2. 创建 BufferGeometry

    • 生成粒子的位置和颜色数据。
    • 将这些数据绑定到 WebGL 缓冲区。
    • 将这些缓冲区转换为 GLBufferAttribute 并设置为几何体的属性。
  3. 设置粒子系统和材质

    • 使用 PointsMaterial 创建粒子材质。
    • 将材质和几何体结合成 Points 对象,并添加到场景中。
  4. 动画和渲染循环

    • 通过 requestAnimationFrame 实现动画循环。
    • 在每一帧中更新粒子系统的旋转,并调用渲染器渲染场景。
  5. 窗口调整处理

    • 监听窗口大小变化事件,调整相机和渲染器的尺寸。

压图地址

image.png

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

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

压图地址

🎉 您是否曾为图片太大无法上传而烦恼?是否为图片格式不兼容而头疼?现在,有了我们的图片处理工具,这些问题将不复存在!

🌟 功能亮点:

批量压缩:无论您有多少张图片,无论尺寸大小,我们的工具都能一次性处理,让您的工作效率翻倍!
格式转换:支持多种图片格式之间的轻松转换,满足您在不同场景下的使用需求。
压缩质量可调:想要保留更多细节?还是追求更小的文件大小?压缩质量由您说了算!
长图片分割:再也不用担心长图无法完整显示或处理了,我们的工具能轻松将长图分割成多张图片,方便您进行后续编辑和分享。
获取网络图片:可将网络路径图片路径,转化成自己的图片进行处理下载,支持批量转换图片下载
📷 无论是从相机导出的大图,还是手机拍摄的生活照,我们的工具都能轻松应对,让您的图片处理变得简单又高效!

💡

压图地址

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com