`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

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

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

压图地址

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

🌟 功能亮点:

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

💡

压图地址

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

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

相关文章

阿里AI图片编辑新项目,人人都可做设计师。MimicBrush本地一键整合包下载

最近阿里巴巴联合香港大学开源了一个创新图像编辑工具&#xff1a;MimicBrush&#xff0c;这个工具相当于是一个局部重绘工具。它通过先进的AI技术&#xff0c;能够将一张图片的某一部分融合到另一张图片上。 MimicBrush&#xff0c;一款颠覆传统的图像编辑神器&#xff0c;不过…

深度学习 --- stanford cs231学习笔记四(训练神经网络的几个重要组成部分之一,激活函数)

训练神经网络的几个重要组成部分 一 1&#xff0c;激活函数&#xff08;activation functions&#xff09; 激活函数是神经网络之于线性分类器的最大进步&#xff0c;最大贡献&#xff0c;即&#xff0c;引入了非线性。这些非线性函数可以被分成两大类&#xff0c;饱和非线性函…

一站式家装服务管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;装修风格管理&#xff0c;主材管理&#xff0c;用户管理&#xff0c;基础数据管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;装修风格&#xff0…

Chained Together卡顿严重怎么办 链在一起卡顿频繁的解决方法

链在一起/Chained Together这款游戏特别适合四个人一起玩&#xff0c;游戏里四个玩家将会被锁链“链在一起”&#xff0c;然后一起在各个地图闯关&#xff0c;不仅考验玩家们的默契配合&#xff0c;还考验智慧和勇气。在链在一起中&#xff0c;玩家需要根据地形和岩浆的分布情况…

淘宝订单物流信息获取:详细操作指南

一、前言 淘宝作为中国最大的电商平台之一&#xff0c;其订单管理系统为商家提供了丰富的接口&#xff0c;用于查询、管理和跟踪订单信息。本指南将详细介绍如何通过淘宝订单接口获取物流信息&#xff0c;帮助商家更好地管理订单和提供优质的物流服务。 二、获取物流信息的步…

php框架的文档和社区支持如何?

在选择 php 框架时&#xff0c;文档和社区支持至关重要,拥有全面的文档和庞大活跃的社区&#xff0c;而 symfony 的文档内容丰富但更适合高级开发人员。codeigniter 4 的文档易于理解&#xff0c;社区规模较小但活跃。yii 2 的文档全面深入&#xff0c;但格式可能令初学者困惑。…

牛拜克拉丝的wordpress免费企业模板

wordpress免费企业模板 挺简洁实用的wordpress免费企业模板&#xff0c;黄色模板搭建公司网站。 演示 https://www.wpniu.com/themes/40.html

allegro 打开 brd文件时提示 WARNING(SPMHDB-212) 告警 应该如何解决呢?

WARNING(SPMHDB-212) &#xff1a;This design has functionality disabled due tothe current product plus options selected. The following features aredisabled: Maximum Crosstalk, Maximum Peak Crosstalk. [help] 步骤 按下图 将allegro编辑器为可设计高速线相关的…

Elastisearch集群(单节点)

目录 一、文件下载 二、创建linux es用户 三、上传、解压canal、es、kibana 四、配置es通讯证书&#xff08;生成证书给es配置使用&#xff09; 五、配置elastisearch 六、修改系统配置 七、添加ik分词器支持&#xff08;可选&#xff09; 八、给文件赋值权限 九、设置…

71-TCP协议工作原理及实战

一 服务器端 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer> // 专门用于建立TCP连接并传输数据信息 #include <QtNetwork> // 此模块提供开发TCP/IP客户端和服务器的类QT_BEGIN_NAMESPACE namespace Ui { class M…

164万年后的日期解析引发的OOM

名词解释 商家销项发票业务&#xff08;平台给商家开票&#xff09;&#xff0c;是平台提供给商家的工具产品&#xff0c;商家购买了平台的服务&#xff0c;那么平台需要开票给商家。 前言 本文所描述的问题&#xff0c;是应用的OOM引发的接口成功率下跌&#xff0c;排查过程中…

【LLM之NL2SQL】DAIL-SQL论文阅读笔记

研究背景 该研究旨在提供一个全面、系统的评估框架&#xff0c;用于评估基于大型语言模型&#xff08;LLM&#xff09;的Text-to-SQL技术。特别强调了不同的提示工程策略的有效性和效率&#xff0c;以及开源LLM的可行性。研究的重点是评估在零样本和少样本场景下的不同问题表示…

webgis 之 地图投影

地图投影 什么是地图投影目的种类等角投影的分类墨卡托投影Web 墨卡托投影 参考小结 为了更好地展示地球上的数据&#xff0c;需要将地球投影到一个平面上。地图投影是一个数学问题&#xff0c;按照一定的几何关系&#xff0c;将地球上的经纬度坐标映射到一个平面上的坐标。地球…

力扣hot100:(The Last one)287. 寻找重复数(快慢指针,静态链表)

LeetCode&#xff1a;287. 寻找重复数 “暴力” 不懂技巧&#xff0c;那就暴力&#xff01; 哈希表&#xff1a; 时间复杂度&#xff1a; O ( n ) O(n) O(n) 这个题体现不出 O ( n ) O(n) O(n)的作用&#xff0c;因为 n < 100 n < 100 n<100 空间复杂度&…

VirtualBox出错,从主机复制文件,乱改内容

昨天烧录机器&#xff0c;测试对方更新的一个库&#xff1a; 开始正确。后来莫名其妙崩溃。反复烧了几次&#xff0c;都错误。复制了老版本的库&#xff0c;正常。再改回新版本&#xff0c;崩溃。 于是把整个打包目录给了对方&#xff0c;他一对比&#xff0c;发现文件不对&am…

Windows应急响应靶机 - Web2

一、靶机介绍 应急响应靶机训练-Web2 前景需要&#xff1a;小李在某单位驻场值守&#xff0c;深夜12点&#xff0c;甲方已经回家了&#xff0c;小李刚偷偷摸鱼后&#xff0c;发现安全设备有告警&#xff0c;于是立刻停掉了机器开始排查。 这是他的服务器系统&#xff0c;请你…

Springboot获取resources中的文件

1.Springboot以文件的形式获取resources中的文件 import com.google.gson.JsonIOException; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.springframework.util.ResourceUtils; import j…

2024.6最新版eclipse下载与安装(汉化教程)超详细教程来咯!!!包懂的

1.eclipse简介 Eclipse 是一个开放源代码的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java编程&#xff0c;但也可以通过插件支持其他编程语言&#xff0c;如C/C、Python、Perl等。Eclipse 被广泛应用于企业环境中&#xff0c;特别是在Java社区中&#xff0…

selenium常见难点解决方案

勾选框勾选问题 勾选框代码逻辑实现过程&#xff1a; 第一步&#xff1a;首先找到勾选框的元素&#xff1b; 第二步&#xff1a;检查它是否已经被勾选。如果已经勾选&#xff0c;则进行取消勾选操作&#xff1b;如果未勾选&#xff0c;则进行点击勾选操作&#xff1b; 以下是一…

audacity音频处理

1.安装 Audacity | Free Audio editor, recorder, music making and more! 添加OpenVINO插件: https://zhuanlan.zhihu.com/p/676542556 2.使用 2.1注意事项 1.编辑音频,点击左上方打开或导入都可以;打开视频文件则需要安装ffmpeg模块,打开后只显示视频中的音频信息; 2.编辑…