基于three.js生成动态波浪背景效果

非常漂亮的Web前端波形点击效果 非常漂亮的Web前端波形点击效果 介绍一种Web前端波形点击效果,第一次发文,大佬勿喷。 介绍 Waves 这需要 Waves ,但是作者早在2018年就停止了对他的更新。 官网:Waves官网 - http://fian.my.id/Waves/ 下载最新:v0.7.6(2018.01.10)【最新】 Github:https://github.com/fians/Waves 使用 Waves 首先把 waves.min.css和waves.min.js引入您的html即可。像这样: <link 阅读详情


前言

基于three.js生成动态波浪背景效果
在这里插入图片描述


一、安装three

npm i three -S

二、新建waves.js文件

注意geometry.setAttribute和geometry.addAttribute和在不同版本会报错,切换其他一个即可兼容

import * as THREE from 'three';

var SEPARATION = 100,
  AMOUNTX = 50,
  AMOUNTY = 50;
var container;
var camera, scene, renderer;
var particles,
  count = 0;
var mouseX = 0,
  mouseY = 0;
var windowHalfX = window.innerWidth / 2;
var windowHalfY = window.innerHeight / 2;

function init(id) {
  container = document.querySelector('#' + id) || document.createElement('div');
  camera = new THREE.PerspectiveCamera(100, window.innerWidth / window.innerHeight, 1, 10000);
  camera.position.y = 600;
  camera.position.z = 1200;
  scene = new THREE.Scene();
  //
  var numParticles = AMOUNTX * AMOUNTY;
  var positions = new Float32Array(numParticles * 3);
  var scales = new Float32Array(numParticles);
  var i = 0,
    j = 0;
  for (var ix = 0; ix < AMOUNTX; ix++) {
    for (var iy = 0; iy < AMOUNTY; iy++) {
      positions[i] = ix * SEPARATION - (AMOUNTX * SEPARATION) / 2; // x
      positions[i + 1] = 0; // y
      positions[i + 2] = iy * SEPARATION - (AMOUNTY * SEPARATION) / 2; // z
      scales[j] = 1;
      i += 3;
      j++;
    }
  }
  var geometry = new THREE.BufferGeometry();
  console.log('geometry_geometry', geometry)
  geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
  geometry.setAttribute('scale', new THREE.BufferAttribute(scales, 1));
  var material = new THREE.ShaderMaterial({
    uniforms: {
      color: { value: new THREE.Color('rgb(182, 232, 255)') },
    },
    // vertexShader: document.getElementById('vertexshader').textContent,
    // fragmentShader: document.getElementById('fragmentshader').textContent,
    vertexShader: `
    attribute float scale;
      void main() {
        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
        gl_PointSize = scale * ( 300.0 / - mvPosition.z );
        gl_Position = projectionMatrix * mvPosition;
      }`,
    fragmentShader: `
    uniform vec3 color;
      void main() {
        if ( length( gl_PointCoord - vec2( 0.5, 0.5 ) ) > 0.475 ) discard;
        gl_FragColor = vec4( color, 1.0 );
      }`,
    alphaTest: 0.5,
  });
  //
  particles = new THREE.Points(geometry, material);
  scene.add(particles);
  //
  renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight >> 1);
  container.appendChild(renderer.domElement);

  document.addEventListener('mousemove', onDocumentMouseMove, false);
  document.addEventListener('touchstart', onDocumentTouchStart, false);
  document.addEventListener('touchmove', onDocumentTouchMove, false);
  //
  window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
  windowHalfX = window.innerWidth / 2;
  windowHalfY = window.innerHeight / 2;
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight >> 1);
}
//
function onDocumentMouseMove(event) {
  mouseX = event.clientX - windowHalfX;
  mouseY = event.clientY - windowHalfY;
}
function onDocumentTouchStart(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}
function onDocumentTouchMove(event) {
  if (event.touches.length === 1) {
    event.preventDefault();
    mouseX = event.touches[0].pageX - windowHalfX;
    mouseY = event.touches[0].pageY - windowHalfY;
  }
}
//
function animate() {
  requestAnimationFrame(animate);
  render();
}
function render() {
  var cy = (-mouseY - camera.position.y) * 0.01;
  camera.position.x += (mouseX - camera.position.x) * 0.02;
  // camera.position.y += (-mouseY - camera.position.y) * 0.01;
  // camera.position.y += cy < -1 ? -1 : cy;
  camera.lookAt(scene.position);
  var positions = particles.geometry.attributes.position.array;
  var scales = particles.geometry.attributes.scale.array;
  var i = 0,
    j = 0;
  for (var ix = 0; ix < AMOUNTX; ix++) {
    for (var iy = 0; iy < AMOUNTY; iy++) {
      positions[i + 1] = Math.sin((ix + count) * 0.3) * 100 + Math.sin((iy + count) * 0.5) * 100;
      scales[j] = (Math.sin((ix + count) * 0.3) + 1) * 5 + (Math.sin((iy + count) * 0.5) + 1) * 5;
      i += 3;
      j++;
    }
  }
  particles.geometry.attributes.position.needsUpdate = true;
  particles.geometry.attributes.scale.needsUpdate = true;
  renderer.render(scene, camera);
  count += 0.1;
}

export default function threeWaves(id) {
  init(id);
  animate();
}

三、引入waves.js文件比查看效果

  • components/waves/index.vue
<script lang="ts" src="./index.ts" />

<template>
  <div class="login flex-align-center">
    
    <div class="brand-info waves" id="waves-js"></div>
    
    <!-- <script type="x-shader/x-vertex" id="vertexshader">
      attribute float scale;
      void main() {
        vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
        gl_PointSize = scale * ( 300.0 / - mvPosition.z );
        gl_Position = projectionMatrix * mvPosition;
      }
    </script>
    <script type="x-shader/x-fragment" id="fragmentshader">
      uniform vec3 color;
      void main() {
        if ( length( gl_PointCoord - vec2( 0.5, 0.5 ) ) > 0.475 ) discard;
        gl_FragColor = vec4( color, 1.0 );
      }
    </script> -->
    
  </div>
</template>

<style scoped lang="less">
.login {
  width: 100%;
  height: 100%;
  background: @273b84;
  
}
.brand-info {
  color: #fff;
  width: 100%;
  height: 100%;
  position: absolute;
  left: 0;
  background: none;
  background-color: transparent;

  &.particles {
    top: 0;
    z-index: 6
  }

  &.waves {
    height: 50%;
    bottom: 0;
    z-index: 5;
  }
}
</style>

  • components/waves/index.js
import { defineComponent, onMounted } from 'vue'
import threeWaves from '@/assets/libs/waves';

export default defineComponent({
  setup() {
    onMounted(() => {
      threeWaves('waves-js');
    })
    return {
    };
  },
});

效果
在这里插入图片描述


如有启发,可点赞收藏哟~

JavaScript 动态网页实例 —— 背景效果 页面背景是网页设计中必不可少的重要内容之一,其背景的好坏直接影响网页浏览者的浏览兴趣。网页背景分为背景图和背景色两种,对于普通的背景图和背景色,完全可以通过HTML实现,而要实现复杂的背景效果,则需要借助于JavaScript。本章介绍页面背景的一些实现效果。首先是一个页面背景随机切换的实例:然后,通过3种不同的方法,分别实现用户对页面背景的自动选择:最后,介绍一个闪电的页面背景效果。 阅读详情

相关推荐

Three.js实现一个动态的 3D 点阵波浪效果

使用 Three.js 创建了一个动态的 3D 点阵波浪效果,可用作页面背景。它通过粒子系统生成点阵,并根据鼠标移动和时间动态调整点的位置和大小,形成波浪效果。控制波浪的长度、颜色和位置。

han2434的博客 681

three.js 实现波纹效果

可以使用 THREE.ShaderMaterial 来实现波纹效果。首先,你需要创建一个网格并使用 THREE.ShaderMaterial 来渲染它。然后,你可以使用 THREE.ShaderMaterial 的 uniforms 属性来传递相关的参数(例如波纹的速度和波纹的强度)到着色器中。最后,在着色器中实现波纹效果的算法。 这是一个简单的例子: // 创建网格 const geometry...

weixin_42581003的博客 910

vue3 + threejs 实现仿iView官网大波浪特效

一、效果图 先上最终效果图: 具体效果可参考iview官方界面iView - 一套高质量的UI组件库 大波浪效果,使用的是three.js的官方例子,需要先安装three.js支持,具体可以看官方实例 three.js examples (threejs.org) 二、代码 1.安装threejs npm install --save three 2.代码(复制可用) components文件夹新建组件waves.vue,直接复制代码如下,可直接运行: <template> <di

sea9528的博客 4700

Vue_button实现水波纹效果

目录结构: 和调用方法 index.js: import waves from './waves' const install = function(Vue) { Vue.directive('waves', waves) } if (window.Vue) { window.waves = waves Vue.use(install); // eslint-disable-l...

Tom__cy的博客 3350

vue使用three.js实现粒子波浪效果

vue使用three.js实现粒子波浪效果

weixin_44953689的博客 1322

waves-js:画布上的七彩波浪效果

Waves-js 画布上的七彩波浪效果 这是我在为我的投资组合创建的动画 我非常热衷于音乐,所以我想制作一些类似于声波的糖果。 这是一个大致的工作原理: 有一个包含多个波的阵列(它们的最大振幅,相位,频率等)。 每个波都分配有一个X坐标,在该坐标上其放大幅度将具有最大值和一个在其上衰减的范围。 根据在X轴上距鼠标的距离来计算波的振幅。 振幅> 0的每个波都绘制在画布的左右两侧。 在画布的中心绘制振幅大于0的所有波的叠加。

html5实现波浪,three.js实现的波浪效果

看到2016云栖大会页面上three.js实现的波浪效果很赞,所以拔下来分享一下,以备后用。CSS背景:body {background-color: #193c6d;filter: progid: DXImageTransform.Microsoft.gradient(gradientType=1, startColorstr='#003073', endColorstr='#029797');...

weixin_39842237的博客 1019

ThreeJS-Interactive-Wireframe:在正弦函数、Dat.GUI 和 Three.js 的帮助下,可以实现迷幻的视觉效果

ThreeJS-交互式线框 在正弦函数、Dat.GUI 和 Three.js 的帮助下,可以实现迷幻的视觉效果。 指示 在现代浏览器中访问。 也应该在智能手机上工作。 用鼠标滚轮放大和缩小。 智能手机目前无法缩放。 单击两个小对象以切换它们的线框。 调整滑块以奇怪的方式为巨大的颠簸球体设置动画。 享受结构化的混乱。 公式 ####Sphere 公式: sin( ( vertex_index + x ) ∗ 频率 + 相位 ) ∗ 幅度 + 中心。 它一个一个地改变每个顶点,按指定的轴之一排序。 是 vertex_index 变量赋予它流动/混沌运动。 ####背景公式: sin(x ∗ 频率 + 相位) * 幅度 + 中心 背景由三种颜色组成:红色、蓝色和绿色 每种颜色都有自己的正弦波。 这会产生有趣的结果: 给每个相同的频率。 将它们的相位偏移 120°。 它会穿过彩虹

前端three.js ——粒子波浪效果实践

通过将对象添加到场景中,Three.js 的渲染器可以将这些对象渲染为二维图像,从而实现三维场景的可视化。new THREE.WebGLRenderer() 得到的渲染器可以将3D模型渲染至 <canvas>容器中。之后便可直接在其他页面上直接导入使用,另外需要注意导入后的页面元素层级关系,避免某些元素的原有布局被影响。three.js创建的场景对象Scene是一个容器 ,用于组织管理三维空间中的所有对象。3、基于上面两步得到的粒子几何位置与材质纹理构建一个几何体对象。three.js 粒子波浪效果。

weixin_63165009的博客 1108

脑机接口技术介绍、应用与挑战

脑机接口的概念最先于1973年提出,伴随着计算机性能的飞速提高,在美国“人类脑计划”的资金支持下,脑机接口的研究进入了高速发展期。去年年末,我国科技部会议透露:中国将拿出540亿元,推进中国脑计划的发展。同时,这一举措也推动了我国脑机接口的研究发展。 脑机接口属于多学科交叉科技,涉及神经科学、计算机科学、认知科学、控制与信息科学技术、医学等多个学科。技术实现方式是通过信号采集设备从大脑皮层采集脑电信号,经过放大、滤波、A/D转换等处理,转换为可以被计算机识别的信号,然后对信号进行预处理,提取特征信号,再利

weixin_44603934的博客 9132

Meta开源Ego-Exo4D数据集:如何用1400小时多模态视频训练你的AI模型

Meta开源的Ego-Exo4D数据集包含1400小时多模态视频,涵盖第一人称和第三人称视角、眼动追踪、IMU传感器等多种模态,是AI模型训练的宝贵资源。本文详细介绍了从数据集下载、预处理到模型训练的全流程,帮助研究者高效利用这一多模态数据集进行AI模型开发。

weixin_29159441的博客 342

科技感十足的大波浪动画(three.js)

&lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, m

徐同保的专栏 5157

【VeriStand】从零构建HIL测试平台:核心概念、硬件选型与实战配置指南

本文详细介绍了如何从零构建HIL测试平台,涵盖核心概念、硬件选型与实战配置指南。重点解析了VeriStand生态系统的优势,包括开箱即用特性、与LabVIEW的黄金搭档配合及Python支持。通过实战案例和硬件选型建议,帮助工程师高效搭建可靠的HIL测试平台,提升测试效率与安全性。

weixin_29250573的博客 329

前端Vue中实现超炫酷动态背景(全屏背景+自定义banner+登录/注册页)

前端Vue中实现超炫酷动态背景(全屏背景+自定义banner+登录/注册页)

AI布道师丨波仔椿 4万+

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1243

uni-app开发-第3篇:uni-app 页面与路由

本文详细介绍了 uni-app 中的页面开发与路由管理。首先,页面是应用的基础单元,创建页面时需在pages目录下新建文件夹和.vue文件,页面结构由<template>、<script>和<style>三部分组成。uni-app 页面生命周期函数包括onShow、onReady、onHide和onUnload,分别用于处理页面显示、渲染完成、隐藏和卸载时的逻辑。其次,路由管理通过pages.json文件配置页面路径和样式,并提供uni.navigateTo等方法进行路由

无 415

three.js实现随机山脉波纹效果

three.js小白的学习之路。好久没有更新了,今天分享一个简单的小效果,可以放在网站首页顶部当个背景展示,大概效果如下所示:下面来分步介绍一下。

VcB之殇的博客 800

基于 YOLOv26 的高速抛物识别系统:微小目标检测

本文提出了一种基于YOLOv26的高速抛物识别系统,专注于微小目标检测。系统采用多模块协同架构,包括视频预处理、YOLOv26检测、目标跟踪和抛物行为分析等模块。关键技术包括YOLOv26s模型检测、DeepSORT目标跟踪和边缘计算部署。通过构建包含多种抛物类型的专业数据集,并应用数据增强技术提升模型性能。系统实现了车辆检测、微小抛物目标识别、抛物轨迹分析和风险等级评估等功能,可实时检测高速公路上的抛物行为并触发告警,为交通管理提供智能化解决方案。

一键难忘的博客 632

推荐几种简洁美观的博客背景效果

由线条组成的动态效果,线条会随着鼠标的移动和停止而不断汇聚,形成类似蜂窝巢一样的结构。由线条和小球组成的动态效果,线条和小球相互连接,会随着鼠标的移动而改变方向。这种背景效果是一条颜色鲜艳的彩色丝带,随着鼠标点击可以自动变换舞动。由小球组成的动态波浪效果,波浪起伏方向会随着鼠标的移动而改变方向。在很多的博客网页中,都有一些非常简洁美观的博客动画背景,比如。由线条模拟光球的动态效果,光球会随着鼠标的移动而旋转改变方向。以上的内容是背景效果图和效果图对应需要的。文件的时候,需要将这些。

千里之行,始于足下 1616

【ESP32CAM+Android+OpenCV】自定义目标数据集、训练自己的OpenCV模型部署到手机APP并对ESP32CAM无线图传显示并实时检测识别目标_资料编号30

本项目实现自定义目标数据集(想检测什么就检测什么,按照本文教程自己来更换目标)、训练自己的OpenCV模型实时检测识别(pycharm工程)。手机APP(Android studio工程)部署OpenCV模型实现对ESP32CAM(arduino工程)无线WIFI图传过来的图像实时检测识别。 本文以火焰检测识别为例进行演示,通过该过程,结合本文可自定义尝试更换为其它目标的检测,例如更换为车辆、车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人、口罩、行为、水果、植物、农作物、建筑、损伤等等部署进行检测。

嵌入式阿齐Archie 3482

19、情境理论中的信息结构解析

本文系统解析了情境理论中的信息结构,从信息元(infon)的基本概念出发,深入探讨了关系结构与简单信息结构的构建方法,分析了标准信息结构所满足的一系列公理(如A1-A14),并阐述了角色、同一性、高阶信息、循环现象、参数适当性及信息元部分性等核心性质。通过具体示例和流程图展示了信息结构的构建过程,并对比了不同公理下的结构差异,最后讨论了该理论在与其他领域融合中的发展趋势及面临的挑战。

book8的博客 78

【亲测免费】 探索无限创意:基于Three.js的超酷线条动画特效

探索无限创意:基于Three.js的超酷线条动画特效 【下载地址】基于three.js的超酷线条动画特效 这是一款基于three.js的超酷线条动画特效。该特效使用THREE.MeshLine库来制作WebGL线条动画特效,共有5个示例效果。每个示例都展示了不同的线条动画效果,适合用于网页设计、游戏开发或其他需要动态视觉...

gitblog_09704的博客 958

IEM模型,地表粗糙度模拟

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

一款粒子跳动及粒子波浪(iview)组件

收集两款vue的组件 1,粒子波浪,该波浪来自与iview的官网(http://v1.iviewui.com/),该粒子波浪引入前,请npm install --save three 效果如下(截出来的gif不太好看,真实效果比这个好看): 颜色背景自行更改 http://v1.iviewui.com/ <template> <div id="indexLizi"...

gongpan2468的博客 2978

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

动画背景效果

一个特别简单的雪花飘落的背景,直接看代码 css样式 body{background:#009966;margin:0;padding:0;overflow: hidden;} .snow{position:absolute;top:0;color:#fff;} js setInterval(() => { v...

钱辉 542

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

终极指南:如何使用Three.js Ocean水面着色器打造逼真海洋世界

想要在浏览器中创建令人惊叹的真实海洋效果吗?🌊 Three.js Ocean水面着色器正是您需要的终极解决方案!这款强大的着色器专门为Three.js设计,能够实时渲染出令人难以置信的真实水面效果,从广阔的海洋到小型水域表面都能完美呈现。 ## ✨ 什么是Three.js Ocean水面着色器? Three.js Ocean是一个基于WebGL技术的高性能水面着色器,它采用了先进的渲染算法来

gitblog_00206的博客 756

three.js 波浪图

<template> <div id="container" ></div> </template> <script> import * as THREE from 'three'; const SCREEN_WIDTH = window.innerWidth, SCREEN_HEIGHT = window.innerHeight, r = 450; let container let mouseY = 0, win

u014722196的博客 532
上一篇: 记录创建粒子的轻量级JavaScript库——particles.js(可用于登录等背景显示)
下一篇: 常用npm包(依赖包)收集
失眠时间
博客等级 码龄7年 9134粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值