首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在glsl和三个js中将粒子推离鼠标位置

基础概念

GLSL(OpenGL Shading Language)是一种用于编写着色器程序的高级着色语言,主要用于图形渲染。着色器是运行在GPU上的小程序,用于处理图形渲染过程中的各个阶段,如顶点着色器和片段着色器。

Three.js是一个基于WebGL的JavaScript库,用于在浏览器中创建和显示3D图形。它简化了WebGL的复杂性,使得开发者可以更容易地创建复杂的3D场景和动画。

相关优势

  • GLSL:直接运行在GPU上,处理速度快,适合实时图形渲染。
  • Three.js:简化了WebGL的开发过程,提供了丰富的3D对象和材质,便于快速开发3D应用。

类型

  • 顶点着色器:处理顶点数据,如位置、法线等。
  • 片段着色器:处理像素级别的渲染,如颜色、纹理等。

应用场景

  • 游戏开发:用于实现粒子效果、光影效果等。
  • 数据可视化:用于创建动态的3D图表和数据展示。
  • 虚拟现实和增强现实:用于创建沉浸式的3D环境。

实现粒子推离鼠标位置

以下是一个简单的示例,展示如何在Three.js中使用GLSL着色器将粒子推离鼠标位置。

HTML部分

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Particle Push Away from Mouse</title>
    <style>
        body { margin: 0; }
        canvas { display: block; }
    </style>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/build/three.min.js"></script>
<script src="app.js"></script>
</body>
</html>

JavaScript部分(app.js)

代码语言:txt
复制
// 创建场景、相机和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建粒子系统
const particleCount = 1000;
const particles = new THREE.BufferGeometry();
const positions = new Float32Array(particleCount * 3);
for (let i = 0; i < particleCount * 3; i++) {
    positions[i] = (Math.random() - 0.5) * 10;
}
particles.setAttribute('position', new THREE.BufferAttribute(positions, 3));

const particleMaterial = new THREE.ShaderMaterial({
    uniforms: {
        mousePos: { value: new THREE.Vector2(0, 0) }
    },
    vertexShader: `
        uniform vec2 mousePos;
        void main() {
            vec3 pos = position;
            float distance = length(mousePos - (pos.xy * 2.0 - 1.0));
            pos.z += distance * 0.1;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
        }
    `,
    fragmentShader: `
        void main() {
            gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
        }
    `
});

const particleSystem = new THREE.Points(particles, particleMaterial);
scene.add(particleSystem);

camera.position.z = 5;

// 监听鼠标移动事件
const mouse = new THREE.Vector2();
window.addEventListener('mousemove', (event) => {
    mouse.x = (event.clientX / window.innerWidth) * 2 - 1;
    mouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
    particleMaterial.uniforms.mousePos.value.copy(mouse);
});

// 渲染循环
function animate() {
    requestAnimationFrame(animate);
    renderer.render(scene, camera);
}
animate();

解释

  1. HTML部分:创建一个基本的HTML页面,引入Three.js库和自定义的JavaScript文件。
  2. JavaScript部分
    • 创建场景、相机和渲染器。
    • 生成粒子系统,随机初始化粒子的位置。
    • 使用自定义的着色器材料(ShaderMaterial),其中包含顶点着色器和片段着色器。
    • 在顶点着色器中,计算每个粒子与鼠标位置的距离,并根据距离调整粒子的Z坐标,使其推离鼠标位置。
    • 监听鼠标移动事件,更新着色器中的鼠标位置。
    • 启动渲染循环,不断渲染场景。

参考链接

通过这种方式,你可以实现一个简单的粒子系统,使粒子推离鼠标位置,适用于各种需要动态交互效果的场景。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

纯Shading Language绘制飞机火焰效果

火焰的例子我已发在 http://js.do/hightopo/fireball,其本质绘制gl.POINTS的点类型时,通过Fragment Shader点区域内生成noise的噪声用于绘制多种颜色效果...《HT图形组件设计之道(四)》文中的例子我将在飞机的尾部叠加该火焰效果,由于考虑到自定义GLSL的复杂性,HT并未开放图元自定义GLSL的功能,我们将要采用的是Graph3dView的上层再次叠加一个...,火焰的位置我们是这样实现的,将一个隐藏的node节点host到飞机的尾部,这样该节点会自定跟随飞机飞行过程的位置变化,绘制时火焰时我们通过Graph3dView#toViewPosition函数将node...千辛万苦终于让飞机飞出了我想要的效果(http://v.youku.com/v_show/id_XODYyMzU3MDg0.html),当然还有无数的细节可以完善,例如可以根据飞机eye的距离动态改变...POINT点的大小,或改造GLSL实现烟雾的粒子系统效果等等,但元旦假期结束了我明天还要上班,其他可完善的地方留给读者去想象了。

78360

纯Shading Language绘制飞机火焰效果

火焰的例子我已发在 http://js.do/hightopo/fireball,其本质绘制gl.POINTS的点类型时,通过Fragment Shader点区域内生成noise的噪声用于绘制多种颜色效果...《HT图形组件设计之道(四)》文中的例子我将在飞机的尾部叠加该火焰效果,由于考虑到自定义GLSL的复杂性,HT并未开放图元自定义GLSL的功能,我们将要采用的是Graph3dView的上层再次叠加一个...,火焰的位置我们是这样实现的,将一个隐藏的node节点host到飞机的尾部,这样该节点会自定跟随飞机飞行过程的位置变化,绘制时火焰时我们通过Graph3dView#toViewPosition函数将node...千辛万苦终于让飞机飞出了我想要的效果(http://v.youku.com/v_show/id_XODYyMzU3MDg0.html),当然还有无数的细节可以完善,例如可以根据飞机eye的距离动态改变...POINT点的大小,或改造GLSL实现烟雾的粒子系统效果等等,但元旦假期结束了我明天还要上班,其他可完善的地方留给读者去想象了。

1.1K60
  • 基于three.js的3D粒子动效实现 顶

    作者:个web前端开发工程师 梁神 一、背景 粒子特效是为模拟现实中的水、火、雾、气等效果由各种三维软件开发的制作模块,原理是将无数的单个粒子组合使其呈现出固定形态,借由控制器、脚本来控制其整体或单个的运动...three.js是用JavaScript编写的WebGL的第三方库,three.js提供了丰富的API帮助我们去实现3D动效,本文主要介绍如何使用three.js实现粒子过渡效果,以及基本的鼠标交互操作...添加鼠标操作事件实现角度控制 我们还可以添加鼠标操作事件实现角度控制,其中winX、winY分别为window的宽高的一半,当然具体的坐标位置可以根据自己的需求进行计算,具体的效果如下图所示。...减少粒子数量 随着粒子数量的增加,需要的计算每个粒子位置大小将会非常耗时,可能会造成动画卡顿或出现页面假死的情况,所以我们在建立模型时可尽量减少粒子的数量,能够有效提升性能。...四、总结 综上所述,实现粒子动效的关键在于计算、维护每个粒子位置状态,而three.js提供了较为便利的方法,可以用于渲染整个粒子场景。

    5.7K11

    基于 three.js 的 3D 粒子动效实现

    three.js是用JavaScript编写的WebGL的第三方库,three.js提供了丰富的API帮助我们去实现3D动效,本文主要介绍如何使用three.js实现粒子过渡效果,以及基本的鼠标交互操作...创建渲染场景scene** scene实际上相当于一个三维空间,用于承载显示我们所定义的一切,包括相机、物体、灯光等。实际开发时为了方便观察可添加一些辅助工具,比如网格、坐标轴等。...添加鼠标操作事件实现角度控制** 我们还可以添加鼠标操作事件实现角度控制,其中winX、winY分别为window的宽高的一半,当然具体的坐标位置可以根据自己的需求进行计算,具体的效果如下图所示。...减少粒子数量** 随着粒子数量的增加,需要的计算每个粒子位置大小将会非常耗时,可能会造成动画卡顿或出现页面假死的情况,所以我们在建立模型时可尽量减少粒子的数量,能够有效提升性能。...四、总结 综上所述,实现粒子动效的关键在于计算、维护每个粒子位置状态,而three.js提供了较为便利的方法,可以用于渲染整个粒子场景。

    6.8K30

    实用 WebGL 图像处理入门

    顶点着色器片元着色器,都是用 WebGL 标准中的 GLSL 语言编写的。这门语言其实就是 C 语言的变体,vec4 则是其内置的 4 维向量数据类型。...虽然这些例子只示范了 GLSL 的基本语法,但别忘了这可是编译到 GPU 上并行计算的代码,单线程的 JS 有着云泥之别。...当然它目前也还有不够理想的地方,希望大家可以多反馈意见建议。 现在,我们就能尝到滤镜链可组合性上的甜头了。依次应用了对比度、色相晕影三个着色器后,渲染效果如下所示: ?...本节内容源自笔者 现在作为前端入门,还有必要去学习高难度的 CSS JS 特效吗?问题下的问答。阅读过这个回答的同学也可以跳过。...空间位置,是粒子的三维坐标,这很好理解 纹理位置,告诉 GPU 需要采样图像的哪个部分 粒子中心位置,相当于让四个顶点团结在一起的 ID,免得各自跑偏了 只要 50 行左右的 JS,我们就可以完成初始数据的计算

    3.1K40

    PhiloGL学习(1)——场景创建及方块欲露还羞出水面

    二、 GLSL部分 GLSL(GL Shading Language)是用来OpenGL中着色的语言,GLSL语言GPU上执行,PhiloGL也使用GLSL语言进行着色。...还有一些其他变量及其他常量函数等,可以自行查阅,后续用到的时候也会再做相应介绍。 2.4 GLSL存放位置 GLSL可以直接以javascript代码块的方式给出,也可以以文件的方式给出。...文件方式 分别定义xxx.fs.glsl文件xxx.vs.glsl文件,将2.12.2部分的内容放入其中即可。 以代码块方式和文件方式调用上会有不同,后面会具体介绍。...3.2 PhiloGL PhiloGL是框架的顶级类,在其中定义了三维场景的所有模块,如摄像机、场景、GLSL加载、键盘鼠标响应事件等等。...原始位置(0,0,0)点。 当场景对象均设置好后,即可进行绘制。

    89460

    【Golang语言社区】H5游戏开发从零开始开发一款H5小游戏(三) 攻守阵营,赋予粒子新的生命

    Player粒子 玩家粒子则由鼠标控制,在上一节中我们已经简单介绍了游戏中的鼠标交互。...经过反复尝试了多次后才实现这个效果。 首先想到要让尾巴长度固定,那么每次render的时候,都在尾部渲染固定数量的粒子。那粒子位置怎么判断呢?...每次render的时候,我们往数组添加一个粒子,记录此时的Player坐标,当数组达到一定长度时,删除尾部粒子,添加新粒子。这样尾巴就记录了Player一个短时间内的各个时间点位置。...Skill粒子实际上可以看做是Enemy中的一种特殊粒子,具有Enemy一样的运动规律。...Skill粒子具有不同的属性颜色,实现起来也很简单。

    860120

    分子对接教程 | (9) VMD可视化对接结果

    鼠标模式改为 Translate Mode(移动模式,T)后,鼠标显示窗口内变为十字箭头 。T模式下,按住鼠标左键拖动为移动结构;右键中键都为放缩功能。...2、恢复结构初始位置:主窗口中点Display\Reset View。或者显示窗口内单击鼠标左键以激活窗口后,点击“=”键。...图4.21 设置三个 representations 及 GLSL 显示模式 如果要删除某一个rep,比如删除第二个rep,需要先选中它(选中后背景色变为浅绿色),再点击 Delete Rep,就删掉了...3)改变显示位置内容(图4.28):主窗口中点击 Graphics→Lables→弹出 Lable 窗口→Properties 标签下选中要调整的 Lable→按住鼠标左键 Offset 坐标系内移动来改变...图4.28 Lable 窗口改变 Lable 位置内容 13、保存结构图: 以刚刚bpti.pdb 这个蛋白质结构文件为例,设置了三个 representations,添加并调整了Lable,得到了最终的蛋白质

    5.7K50

    【一统江湖的大前端(8)】matter.js 经典物理

    粒子是基于引力作用而运动的,初始距离较远的粒子相互靠近的过程中速度是越来越快的,这就可能使得连续的两帧计算中,两个粒子的包围盒都没有重叠,但实际上它们已经发生过碰撞了,而计算机仿真中就会因为逐帧动画的离散性而错过碰撞的画面...所以针对粒子系统的碰撞检测时,除了包围盒以外,通常还会结合速度和加速度的数值方向变化来进行综合判定。...3.2 使用matter.js 构建物理模型 matter.js的官方网站提供的示例代码如下,它可以帮助开发者熟悉基本概念开发流程,你可以【官方代码仓】中找到更多示例代码: var Engine =...这个示例中约束两端的平衡位置是重合在一起的,当玩家使用鼠标拖动小鸟图案附着点离开平衡位置后,就可以看到画面上渲染出的两点之间的弹簧约束,当用户松开鼠标后,弹簧就收缩,附着点就会回到初始位置,回弹的过程是一个类似于阻尼振动的过程...弹射是玩家使用鼠标向画面左下方拖动并松开鼠标后发生的,我们可以依据小鸟附着点的位置进行弹射判定,当小鸟处于锚点右上侧并超过一定距离时,将其判定为可发射,发射的逻辑是生成一个新的小鸟附着点,将原约束中的

    3.3K30

    从线条艺术到DIY实现一个网状体Net的js

    每个问题将对应不同的颜色,可以通过连接相关的单词彩色的线条来回答问题。 几百个选项在网格中按字母顺序显示,给参与者多种可选的答案。...在这里,我们动手实现一个,并稍微拓展下,比如,可以是彩色线条: 实现思路: 画布范围生成一定数量的粒子, 用线连接粒子, 让粒子保持画布内移动。...2 封装成JS库 我希望封装成一个Net构造函数,调用的时候,通过传入canvas,以及一些参数配置,即可生成一个Net。...,两个方法移动每个粒子,并判断粒子的移动方向,更新完粒子位置之后,再次调用drawPoints绘制出所有粒子。...调整后,再次试下: 可以达到下面的效果: 把线改粗点,换几个颜色试试 +鼠标的交互事件 相当于以鼠标位置的x,y坐标为圆心,固定或随机值为半径重新创建一个粒子,并且push进我们之前创建好的粒子群里

    1.2K60

    OpenGL & Metal Shader 编程:ShaderToy 内置全局变量

    由于主流的 Shader 编程网站,如 ShaderToy, gl-transitions 都是基于 GLSL 开发 Shader ,加上 MSL GLSL 语法上差别不大,后面系列文章将以 GLSL...iMouse:用于获取鼠标位置状态信息。它是一个包含四个分量的vec4类型变量,分别表示鼠标的坐标(x y 分量)以及左右键的按下状态(z w 分量)。...你可以 ShaderToy 的片段着色器中使用 iMouse 来根据鼠标位置或点击状态进行交互操作。...以下是一个简单的示例: //使用鼠标位置来改变颜色 void mainImage(out vec4 fragColor, in vec2 fragCoord) { // 获取鼠标屏幕上的归一化坐标...fragCoord / iResolution.xy; vec2 mousePos = iMouse.xy; float mouseClick = iMouse.w; // 鼠标位置附近绘制一个圆形

    81920

    Typescript+WebGL+Webpack开发环境搭建

    WebGL可以理解为OpenGL浏览器环境下的变种,保留了OpenGL ES的语义规范,提供相对简洁的JavaScript API。绝大部分的shader可以实现WebGLOpenGL的共用。...目前支持JavaScript中引入强类型的主流框架有两种:TypeScriptFlow.js。TypeScript是JavaScript的强类型超集,Flow则更接近于一种类型注解或者注释工具。...比如将上述示例代码中的shader源码单独抽为vertex.js如下: export default ` precision mediump float; attribute vec2 a_pos;...第一个问题很好解决,因为我们的目的是把glsl模块引入到js模块中并且作为字符串使用,所以Webpack要做的就是将glsl源码构建为字符串即可: { test: /\.glsl$/, loader...针对上文提到的TypeScript不识别glsljson模块问题,我们源码目录的@types文件夹中创建声明文件global.d.ts,内容如下: declare module '*.glsl';

    2K40

    GPT-4写代码,DALL·E 3+MJ搞定画面,AI版「愤怒的南瓜」来袭

    鬼屋、墓碑蝙蝠等万圣节元素填充背景。游戏徽标位于中心顶部的显著位置,两侧是生气、虎视眈眈的南瓜造型。底部中央有一个「Play」按钮,周围环绕着阴森恐怖的雾气。...完整代码可见:https://bestaiprompts.art/angry-pumpkins/sketch.js 作者游戏中加入了很多细节,比如不同的粒子效果、不同种类的物体。...他使用了一些小技巧 prompt,首先从简单的事情开始做起,比如「我能不能使用 matter.js p5.js 创建一个愤怒的小鸟风格的游戏?...比如「现在我问你,你了解愤怒的小鸟游戏中玩家屏幕上滑动手指来发射小鸟吗?把这种方式添加到要创建的游戏里,不过要改成用鼠标控制。」...再比如「把怪物设计成圆形」、「我想用粒子效果制作一个火炬,是否可以通过 p5.js 来实现?」如此种种,不断与 GPT-4 进行交互试验,最终有了现在的游戏效果。

    34720

    SceneKitScene Kit 概要节点 (Nodes)光照动画开始用 Scene Kit 写游戏扩展默认渲染流程延时着色

    今年(2014年),Scene Kit 变的更加强大,支持了粒子效果、物理引擎、脚本事件以及多通道分层渲染等多种技术,以及(也许对许多人来说最重要的)它被引入iOS,而苹果现在指的是把它当成“休闲游戏”...每个节点相对于其父节点具有位置,旋转缩放,而父节点又相对于其父节点,一直向上,直到根节点。 假如要给一个节点确定一个位置,就必须将它挂载到节点树中的某个节点上。...处理用户输入 Scene Kit 与普通 Cocoa 或 Cocoa Touch 应用使用一样的机制来处理用户输入,如键盘事件、鼠标事件、触摸事件手势识别,而主要区别在于 Scene Kit 中只有一个视图...Scene Kit 不同入口点分别提供了对旋转矩阵、模型数据、样本贴图及渲染后输出的色值的访问。 比如,下面的 GLSL 代码被用在模型数据的入口点中,可以将模型对象上所有点沿 x 轴扭曲。...这是通过定义一个函数来创建一个旋转变换,并将其应用在模型的位置法线上。同时,也自定义了一个 "uniform" 变量来决定对象该如何被扭曲。

    1.5K80

    邀你看一场浪漫的烟火 -- canvas放烟花

    简单的 Html CSS 简单的写点基础样式,背景黑色,定义个canvas标签 <!...创建 canvas画布 js中先获取标签,设置画布大小,采用resize监听页面的调整,及时的改变画布的大小 // 元素获取 const canvas = document.querySelector...获取鼠标点击位置 通过e.clientXe.clientY来获取鼠标点击的位置,用于在后面实现在鼠标点击的位置,产生烟花 function clickSite(e) { // 获取当前鼠标的坐标...实现鼠标点击产生烟花的初级形态 我们一步一步来实现,这是实现烟花效果的第一步,通过点击位置添加一个烟花雏形 ,这是一个单纯的静态,在后面我们慢慢的让它动起来 function drawFires()...,这样会形成向中间合拢的趋势,由于每个粒子都存放在数组当中,当粒子透明度小于0,从数组移除 8.

    2.2K50

    CSS实现一个粒子动效的按钮

    效果就更加震撼了,当然canvas实现也有一定的门槛,而且实际使用起来也略微麻烦(所有js实现的通病),这里尝试一下CSS的实现方式。 生成粒子 抛开js方案,还有HTMLCSS实现方式。...效果还是有的,主要就是多花点时间来调试,这里主要根据偏移量扩展来决定粒子位置大小。...来控制原点的尺寸与位置,看着好像挺复杂,其实只要background-sizebackground-position与background-image位置一一对应就行了。....; background-size: 0% 0%; } 当然直接这样设置肯定是不理想,鼠标离开时会收缩回去,效果如下 ? 我们需要是鼠标离开时不收缩回去,如何实现呢?...很简单,把transition设置:hover下就可以了,表示只有当鼠标经过时才有过渡,离开时没有 .button:hover::before{ background-position: 5% 44%

    1.5K20
    领券