TreeJS的图片粒子化效果

tree.js 制作酷炫照片墙 1.tree.js 是一个用来 制作流畅效果,如果学习的比较深入的话,用来做 游戏 或者 动画片 都是可以的,是一个很不错的js插件; 2.使用教程参考 2.1http://www.hewebgl.com/article/articledir/1 (比较推荐) 这是一个中文网站,资料也比较齐全 2.2https://techbrood.com/threejs/docs/... 阅读详情

1.获取图片像素数据

  • 通过canvas获取像素数据data
const img = document.getElementById("img");
const { width, height } = img;
const canvas = document.createElement("canvas");
canvas.width = width;
canvas.height = height;
const context = canvas.getContext("2d");
context.drawImage(img, 0, 0, width, height);
const data = context.getImageData(0, 0, width, height).data;

  • 解析data,将所有像素点RGBA数据存入origins
//通过particleGap值控制显示粒子总数量
const particleGap = 2;
const origins = [];
for (let g = 0; g < width; g += particleGap) {
  for (let v = 0; v < renderHeight; v += particleGap) {
    const i = 4 * (g + v * width);
    const alpha = data[i+3];
    if (alpha > 0) {
      const r = data[i];
      const g = data[i+1];
      const b = data[i+2];
      this.origins.push({
        x: g,
        y: v,
        z: 50,
        vertexColors: [r/255, g/255, b/255, alpha/255]
      });
    }
   }
}
  • 通过origins创建粒子数组particles
const particles = [];
for (let i = 0; i < origins.length; i++) {
  const p = this.origins[i];
  const o = {};
  o.x = p.x;
  o.y = p.y;
  o.z = 0;
  o.vx = o.vy = o.vz = 0;
  particles.push(o);
}

2.创建three粒子系统

  • 通过THREE.Points创建粒子系统
const scene = new THREE.Scene();
const renderer = new THREE.WebGLRenderer({antialias: true, alpha: true});
renderer.setSize(width, height);
document.body.appendChild(renderer.domElement);
const camera = new THREE.PerspectiveCamera(40, width / height, 0.1, 10000);
camera.position.z = 700;
const geometry = new THREE.BufferGeometry();
const material = shaderMaterial;
const grid = new THREE.Points(geometry, material);
scene.add(grid);
  • 创建shader材质
const vertShader = `
  precision highp float;
  attribute vec4 vertexColor;
  uniform float pointSize;
  uniform float depth;
  vec3 mirror = vec3(1, -1, 1);
  varying vec4 vColor;
  void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4( mirror * position, 1.0 );
    gl_PointSize = pointSize + max((log(position.z) - 3.91) * depth, -pointSize + 1.0);
    vColor = vertexColor;
  }
`;
const fragShader = `
  precision highp float;
  varying vec4 vColor;
  void main() {
    gl_FragColor = vColor;
  }
`;
const uniforms = {
  vertexOffset: {type: 'v3', value: new THREE.Vector3(0, 0, 1e3)},
  pointSize: {type: 'f', value: 1},
  depth: {type: 'f', value: 1},
};
const shaderMaterial = new THREE.ShaderMaterial({
  uniforms: uniforms,
  vertexShader: vertShader,
  fragmentShader: fragShader,
  transparent: true,
});

3.显示图像静态粒子效果

  • 获取顶点坐标和像素数据
let vertices = [];
let colors = [];
for (let i = 0; i < particles.length; i++) {
  const o = origins[i],
    p = particles[i];
  const x = p.x - width / 2,
    y = p.y - height / 2,
    z = p.z;
  const [r, g, b, a] = o.vertexColors;
  vertices.push(x, y, z);
  colors.push(r, g, b, a);
}
  • 向shader传入顶点和像素数据
geometry.setAttribute('position', new THREE.BufferAttribute(new Float32Array(vertices), 3));
geometry.setAttribute('vertexColor', new THREE.BufferAttribute(new Float32Array(colors), 4));
  • 效果如下:

原图:

图片

粒子化效果:

图片

4.让粒子动起来

  • 给粒子添加随机方向速度,使其运动看起来更自然
const noise = 20;
const gravity = .1;
const speed = Math.log(origins.length) / 10;
const gravityFactor = 1 - gravity * speed;
for (let i = 0; i < particles.length; i++) {
  let o = origins[i],
    p = particles[i],
    dx = o.x - p.x + (Math.random() - .5) * noise,
    df = o.y - p.y + (Math.random() - .5) * noise,
    dp = o.z - p.z + (Math.random() - .5) * noise / 1e3,
    dy = Math.sqrt(dx * dx + df * df + dp * dp),
    M = .01 * dy;
  p.vx += M * (dx / dy) * speed,
  p.vy += M * (df / dy) * speed,
  p.vz += M * (dp / dy) * speed;
  p.vx *= gravityFactor,
  p.vy *= gravityFactor,
  p.vz *= gravityFactor,
  p.x += p.vx,
  p.y += p.vy,
  p.z += p.vz;
  const x = p.x - width / 2,
    y = p.y - height / 2,
    z = p.z;
  const [r, g, b, a] = o.vertexColors;
  vertices.push(x, y, z);
  colors.push(r, g, b, a);
}
  • 每一帧都要更新顶点数据
geometry.attributes.position = new THREE.BufferAttribute(new Float32Array(vertices), 3);

5.最终效果如下

图片

JS实现最美的3D宇宙效果 这里给各位同僚说一下,本人已经取消了之前所有分享的百度网盘的资料链接以及本人之前分享的AIRobot链接。之所以这样,是因为本人最近一段时间有个“大动作“。就是将本人之前所有写的项目案例和技术知识点的代码重新封装一下,并且给出demo示例和环境搭建教程,以便各位想了解或者初学者更容易上手。这些项目案例和技术知识点的代码会放到我自己开发的一个云平台中,而且支持远程调试,到时会免费开放给各位。本人正在用自己的业余时间加班加点的开发我的云平台,各位敬请期待!嘿嘿! 通过前面写过的几篇文章,表现结果是C++处理图像 阅读详情

相关推荐

JavaScript TREEJS插件:轻松处理树结构数据

本文还有配套的精品资源,点击获取 简介:JavaScript是用于构建交互式网页应用的主要前端语言。本文重点介绍了一个名为"TREEJS"的JavaScript插件,它专为树形结构数据处理而设计。本文将深入探讨 TREEJS 插件的核心功能,包括树的创建、节点的增删改查等操作方法。这些功能对前端应用,如数据可视化、文件系统和导航菜单等场景尤为有用。通过简洁的API接口,开发...

weixin_33431149的博客 3492

tree.js初体验 | 大帅老猿threejs特训

之前对Web3D并不了解,最近跟着大帅的训练营,通过三天的学习,了解了blender的操作和three.js。下面就用几十行js代码实现一个带动态效果的甜甜圈。

qq_39094860的博客 6808

鸿蒙【ArkTS】使用TS装饰器封装网络请求HTTP

在HarmonyOS应用开发中,通过HTTP访问网络,可以使用官方提供的@ohos.net.http模块。但是官方提供的直接使用不太好使用,需要封装下才好。这里采用TS的装饰器实现AOP效果 完成前后端接口风格的统一

weixin_60376559的博客 5611

tree.js实现3D效果,官网demo

官网地址:https://threejs.org/docs/index.html#manual/zh/introduction/Creating-a-scene 官网demo:一个自动旋转的正方形 这个tree.js主要用的是3D模型图,图可是gitf,3D max制作3D模型 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index

test_00的博客 1万+

05-SA8155 QNX Display框架及代码分析(1)

显示是非常重要的一个模块,人机交互的桥梁。那么SA8155 Hypervisor显示是如何处理的呢。对处理流程非常的好奇O(∩_∩)O哈哈~。TODO。

静虚待令,有物混成 1万+

LittleFS+NANDFLASH软硬件配置详情

littleFS文件系统说明及移植过程

weixin_43200844的博客 2368

Threejs系列--1入门

Threejs系列--入门序言Treejs简介学习Treejs需要了解的基本知识Treejs使用基本步骤一个例子来体会体会吧 随着科技发展,人们对应用交互效果越来越高,我们希望简单的平面交互能使用更多的3D交互效果代替,为了能在短时间内完成炫酷的效果,这便是本系列文章的目的。准备好秃头了吗?少年 ^ 0 ^ Treejs简介 treejs是基于原生WebGL封装运行的三维引擎。可以使用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。 学习Treejs需要了解的基本知识 在上面的解析中,

小猴子喝牛奶的博客 1146

DNF单机版搭建全攻略:从零开始到局域网联机(含常见问题解决)

本文提供详细的DNF单机版搭建指南,从环境配置到局域网联机设置,涵盖服务端安装、数据库配置及常见问题解决方案。适合新手和有经验的玩家,帮助快速搭建专属游戏服务器,重温经典游戏体验。

weixin_30832143的博客 847

什么是Three.js,有什么特点

Three.js 是一个基于 WebGL 技术的 JavaScript 3D 库。它允许开发者在网页上创建和展示 3D 图形内容,而无需用户安装任何额外的插件或软件。Three.js 简化了 WebGL 的复杂性,使得即便是对图形编程不太熟悉的人也能快速上手,构建出令人印象深刻的 3D 场景和动画。Three.js 是一个功能强大且易于使用的 3D JavaScript 库,它极大地降低了使用 WebGL 创建 3D 内容的技术门槛。

小赵的博客 3726

3D Slicer中Auto3DSeg和TotalSegmentator等自动分割插件总是安装失败,怎么办?教你两招

TotalSegmentator, MONAI auto3Dseg,这些工具因分割器官多,准确性高,备受关注。同时,这些自动分割工具被集成在了3D slicer平台,非常方便临床医生做手术规划。详细了解这些工具看之前的教程👇-------- 简单概述 --------其中,MONAIAuto3DSeg扩展附带数十种针对特定临床用例的预训练分割模型,这些模型旨在快速运行,几分钟内即可在任何普通计算机上运行,无需 GPU,甚至在笔记本电脑上。

zzjlhlcd的博客 1698

速腾RS-LiDAR-16激光雷达ROS配置全攻略:从硬件连接到Rviz点云可视化

本文详细介绍了速腾RS-LiDAR-16激光雷达在ROS环境中的配置与使用全攻略,涵盖硬件连接、网络配置、ROS驱动安装及Rviz点云可视化等关键步骤。通过实战案例和技术解析,帮助开发者快速实现激光雷达数据采集与处理,提升机器人感知系统的部署效率。

ooo22的博客 249

TreeJS离屏渲染介绍和运用

帧缓冲区对象可以用来代替颜色缓冲区或深度缓冲区。绘制在帧缓冲区的对象并不会直接显示在canvas上,你可以先对帧缓冲区的内容进行一些处理再显示,或者直接用其中的内容作为纹理图像。在帧缓冲区中进行绘制的过程又称为离屏绘制。(以上摘自)而ThreeJS中的WebGLRenderTarget就是对这个自定义帧缓冲区的封装,这一技术的经典应用就是我们常听到的"屏幕后处理"

ufrontend的博客 1668

ABAQUS二次开发中创建SET

在ABAQUS中创建加载、边界条件时,需要使用set,创建set时需要使用对象集合对象中的Set函数,这个函数需要提供加入对象集合的列表,但这个对象列表好像并不能自行创建,只能通过ABAQUS各类对象集合中的findAt、getSequenceFromMask、getByBoundingSphere、getByBoundingCylinder或getByBoundingSphere函数得到,但这几个函数在直接使用PYTHON编程时都不太好用。这个函数返回一个字典,如下所示。

hohoyu的专栏 2482

mmx实现图片淡入淡出_JS实现最美的3D宇宙特效

好久没更新文章了。算下来大概有五个多月了吧。之前本人更新的比较频繁是因为疫情在家,不能出门,所以有充足的时间来更新文章。之后随着疫情越来越好转,本人就出去找工作了,毕竟本人的经济条件不允许本人闲着,哈哈。之后本人会更新很频繁的,很抱歉!这里给各位同僚说一下,本人已经取消了之前所有分享的百度网盘的资料链接以及本人之前分享的AIRobot链接。之所以这样,是因为本人最近一段时间有个“大动作“。就是将本...

weixin_39878716的博客 637

【QNX Hypervisor 2.2 用户手册】2.6 处理qvm终止

你可以注册通知,以在qvm进程实例退出时得到通知。这样你就可以采取相应的措施来响应这种终止事件。

从0到1,突破自己 1106

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Three.js入门——画星空(star field)

Three.js是一个很流行的3D JavaScript库。这里有一个three.js的入门教程,在浏览器窗口中画出星空。我按照教程重新实现了一遍,这里的这篇博客把教程大致翻译了一遍。我的demo。 变量 定义全局变量: // three.js的主要部分 var camera, scene, renderer, // 跟踪鼠标位置 mouseX = 0, mouseY = 0, // 一

hellogril前端库 2523

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TREE.JS点云模拟下雨场景

话不多说,直接进入关键部分代码。 首先创建点云对象,并将雨滴图片作为纹理贴上去。 //创造点云粒子 creatPointCloud(1,true,1,THREE.vertexColors,true,0xffffff); function creatPointCloud(size,transparent,opacity,vertexColors,sizeAttenuation,color){ let geom=new THREE.Geometry(); let

mmm_morning的博客 863

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ThreeJS系统学习之路

ThreeJS系统学习之路

YunWisdom 1626

【亲测免费】 Tree.js:轻量级树形控件使用指南

Tree.js:轻量级树形控件使用指南 项目介绍 Tree.js 是一个轻量级且高度兼容的树形控件库,它设计得既简单又灵活,能够无缝集成到 VanillaJS、React 或 Vue 中。该控件压缩后的体积很小,且不依赖任何外部库,从而保证了应用的性能和简洁性。Tree.js 支持丰富的事件处理,以及远程数据加载能力,满足多种前端开发场景的需求。 项目快速启动 安装 通过npm安装Tree.js...

gitblog_00143的博客 2223

【亲测免费】 推荐使用:Tree.js - 操作和构建可扩展树状结构的JavaScript库

推荐使用:Tree.js - 操作和构建可扩展树状结构的JavaScript库 项目介绍 Tree.js 是一个轻量级的JavaScript库,专为构建和操作可扩展的树形数据结构而设计。这个库提供了一系列方便的方法,如查找节点、获取属性、添加和删除子节点等,使得在前端处理复杂的数据结构变得更加简单。 虽然这个项目已经不再维护,但它的代码基础仍然可以作为自定义开发的理想起点,或者对学习树形数据结构的...

gitblog_00099的博客 1650

threeJS的简单使用

window.innerWidth / window.innerHeight:这是相机的宽高比,通常设置为浏览器窗口的内部宽度与内部高度的比值,这样可以保证渲染出来的画面在水平和垂直方向上的比例与窗口一致。设置相机在z轴上的位置为6,通过改变相机在z轴方向上的位置,可以调整观察立方体的视角和距离,这里将相机往后移动了一些,以便更好地观察整个立方体。使用前面创建的几何形状和材质创建一个网格对象,这里就是将立方体的几何形状和绿色的材质组合在一起,形成了一个可以在场景中显示的绿色立方体。

weixin_69000635的博客 1200

Three.js零基础入门教程(2023版本)

在正式学习Three.js之前,先做一些必要的准备工作,具体说就是下载threejs官方文件包,threejs官方文件包提供了很多有用的学习资源。下载three.js文件包解压后,你可以看到如下目录(不同版本会略有差异)。对于开发者而言,大家经常接触的是文档docs和案例examples两个文件夹,平时查看文档,可以打开文档docs里面html文件,案例examples里面提供了海量threejs功能案例。three.js-文件包。

u014291990的博客 1万+

开始three.js

不经意间看到了某个官网的动态效果~ 实在是太帅啦!十分地友好 查了查实现该效果地技术 —— 原来是Three.js 那就让我来从零初尝Three.js动态3D效果吧✨✨有大量案例和找寻源码的方法噢✨ 背景 随着当今时期前端地愈来愈普及,页面实现的效果真的是越来越棒! 随着数字图像处理、人工智能技术的发展 展示给用户的视觉效果便不局限于平面的2D视觉效果开始注重于全方位的3D立体展示效果力求对于商品的361度地无死角供用户认识了解 今天~就跟着大大初尝一下优秀的三维引擎 Three.js 了解 ...

大灰狼的小绵羊哥哥的博客 2万+

threejs官网

Threejs官网中文文档:https://threejs.org/docs/index.html#manual/zh/threejs数学几何计算:http://www.webgl3d.cn/pages/001888/threejs基础教程:http://www.webgl3d.cn/pages/aac9ab/webgl基础教程:http://www.webgl3d.cn/pages/9bc0db/blender基础:http://www.webgl3d.cn/pages/00cfc0/

u014291990的博客 2万+

【Three.js】入门必读

Three.js的官网在国外, 访问速度比较慢, 而我们需要经常参考和因此, 考虑将Three.js的官网部署到本地。

liangzhenmeng的博客 3万+

threeJS——安装以及三要素

本章简单介绍前端框架threeJS的使用,使用threeJS我们可以构建出前端的3D界面。不仅能应用在看房、模型分享网站等有需求的项目中,还可以在其他项目中做出酷炫的效果。由此我们已经能够简单使用threeJS创建简单模型,不过想要做出酷炫效果,需要导入外部模型,这个后面再说。

m0_74606902的博客 1389
上一篇: TreeJS实现简单的星际穿越效果
下一篇: ThreeJS实现3D星空隧道效果
优联前端
博客等级 码龄5年 1832粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值