iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么用vue3+threejs实现仿iView官网大波浪特效
  • 349
分享到

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

2023-06-22 02:06:42 349人浏览 泡泡鱼
摘要

这篇文章主要介绍“怎么用vue3+threejs实现仿iView官网大波浪特效”,在日常操作中,相信很多人在怎么用Vue3+threejs实现仿iView官网大波浪特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家

这篇文章主要介绍“怎么用vue3+threejs实现仿iView官网大波浪特效”,在日常操作中,相信很多人在怎么用Vue3+threejs实现仿iView官网大波浪特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用vue3+threejs实现仿iView官网大波浪特效”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前言

Threejs可以理解为是一个WEB端三维引擎(渲染模型,数据可视化),如果有接触过UnralEngine 4(虚幻四)等游戏引擎的,应该很容易理解在一个三维场景必备的每一个部件(场景,渲染器,网格模型,材质,光源,色相机)。好的,基础知识咱们先跳过,直接上实现的过程

一、效果图

先上最终效果图:

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

具体效果可参考iview官方界面iView - 一套高质量的UI组件库

大波浪效果,使用的是three.js的官方例子,需要先安装three.js支持,具体可以看官方实例 three.js examples (threejs.org)

二、代码

安装threejs

npm install --save three

代码(复制可用) components文件夹新建组件waves.vue,直接如下,可直接运行:

<template>  <div id="iviewBg"></div></template><script>import * as THREE from "three";显示右上角fps框// import Stats from "./stats.module";import { onMounted } from "vue";export default {  props: {  //控制x轴波浪的长度    amountX: {      type: Number,      default: 50,    },    //控制y轴波浪的长度    amountY: {      type: Number,      default: 50,    },    //控制点颜色    color: {      type: String,      default: "#097bdb",    },    //控制波浪的位置    top: {      type: Number,      default: 350,    },  },  setup(props) {    const SEPARATioN = 100;    // let stats;    let container, camera, scene, renderer;    let particles,      count = 0;    let mouseX = 0;    let windowHalfX = window.innerWidth / 2;    function init() {      container = document.createElement("div");      document.getElementById("iviewBg").appendChild(container);      //创建透视相机      camera = new THREE.PerspectiveCamera(        75, //摄像机视锥体垂直视野角度        window.innerWidth / window.innerHeight, //摄像机视锥体长宽比        1, //摄像机视锥体近端面        10000 //摄像机视锥体远端面      );      //设置相机z轴视野      camera.position.z = 1000;      //创建场景      scene = new THREE.Scene();      const numParticles = props.amountX * props.amountY;      const positions = new Float32Array(numParticles * 3);      const scales = new Float32Array(numParticles);      let i = 0,        j = 0;      // 初始化粒子位置和大小      for (let ix = 0; ix < props.amountX; ix++) {        for (let iy = 0; iy < props.amountY; iy++) {          positions[i] = ix * SEPARATION - (props.amountX * SEPARATION) / 2; // x          positions[i + 1] = 0; // y          positions[i + 2] = iy * SEPARATION - (props.amountY * SEPARATION) / 2; // z          scales[j] = 1;          i += 3;          j++;        }      }      //是面片、线或点几何体的有效表述。包括顶点位置,面片索引、法相量、颜色值、UV 坐标和自定义缓存属性值。使用 BufferGeometry 可以有效减少向 GPU 传输上述数据所需的开销      const geometry = new THREE.BufferGeometry();      geometry.setAttribute(        "position",        new THREE.BufferAttribute(positions, 3)      );      geometry.setAttribute("scale", new THREE.BufferAttribute(scales, 1));      //着色器材质(ShaderMaterial),设置球的大小,颜色,等      const material = new THREE.ShaderMaterial({        unifORMs: {          //设置球的颜色          color: { value: new THREE.Color(props.color) },        },        //控制球的大小        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 );}",      });      //一个用于显示点的类。      particles = new THREE.Points(geometry, material);      //往场景中添加点      scene.add(particles);      //alpha - canvas是否包含alpha (透明度)。默认为 false。      //渲染器的背景色默认为黑色,设置渲染器的背景色为透明      renderer = new THREE.webGLRenderer({ antialias: true, alpha: true });      renderer.setPixelRatio(window.devicePixelRatio);      renderer.setClearAlpha(0);      renderer.setSize(window.innerWidth, window.innerHeight);      container.appendChild(renderer.domElement);      //显示右上角fps框      // stats = new Stats();      //   container.appendChild(stats.dom);      container.style.touchAction = "none";      //监听鼠标移动事件      container.addEventListener("pointermove", onPointerMove);      //调整波浪的位置      container.style.position = "relative";      container.style.top = `${props.top}px`;      window.addEventListener("resize", onWindowResize);    }    function render() {      camera.position.x += (mouseX - camera.position.x) * 0.05;      camera.position.y = 400;      camera.lookAt(scene.position);      const positions = particles.geometry.attributes.position.array;      const scales = particles.geometry.attributes.scale.array;      // 设置粒子位置和大小      let i = 0,        j = 0;      for (let ix = 0; ix < props.amountX; ix++) {        for (let iy = 0; iy < props.amountY; iy++) {          positions[i + 1] =            Math.sin((ix + count) * 0.3) * 50 +            Math.sin((iy + count) * 0.5) * 50;          scales[j] =            (Math.sin((ix + count) * 0.3) + 1) * 10 +            (Math.sin((iy + count) * 0.5) + 1) * 10;          i += 3;          j++;        }      }      particles.geometry.attributes.position.needsUpdate = true;      particles.geometry.attributes.scale.needsUpdate = true;      renderer.render(scene, camera);      count += 0.1;    }    function onWindowResize() {      windowHalfX = window.innerWidth / 2;      camera.aspect = window.innerWidth / window.innerHeight;      camera.updateProjectionMatrix();      renderer.setSize(window.innerWidth, window.innerHeight);    }    //监听鼠标移动事件    function onPointerMove(event) {      console.log(event);      if (event.isPrimary === false) return;      mouseX = event.clientX - windowHalfX;    }    function animate() {      requestAnimationFrame(animate);      render();      //fps 实时更新      // stats.update();    }    onMounted(() => {      init();      animate();    });    return {};  },};</script><style lang="sCSS" scoped>#iviewBg {  width: 100%;  height: 100vh;  background: url("../assets/wavesBg.png") no-repeat;  overflow: hidden;}</style>

使用

直接在login登录页面引入组件使用

<template>  <wavesBg :top="250"></wavesBg>    <div class="login-container">  </div></template><script>import wavesBg from "../components/wavesBg";export default {  name: "",  components: {    wavesBg,  },  setup() {        return {         };  },};</script>

三、背景图片素材

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

如果不清晰可以去官方界面f12拿,iView - 一套高质量的UI组件库

如下图所示

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

到此,关于“怎么用vue3+threejs实现仿iView官网大波浪特效”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 怎么用vue3+threejs实现仿iView官网大波浪特效

本文链接: https://www.lsjlt.com/news/302062.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么用vue3+threejs实现仿iView官网大波浪特效
    这篇文章主要介绍“怎么用vue3+threejs实现仿iView官网大波浪特效”,在日常操作中,相信很多人在怎么用vue3+threejs实现仿iView官网大波浪特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-22
  • 利用vue3+threejs仿iView官网大波浪特效实例
    目录前言一、效果图二、代码三、背景图片素材总结前言 Threejs可以理解为是一个web端三维引擎(渲染模型,数据可视化),如果有接触过UnralEngine 4(虚幻四)等游戏引擎...
    99+
    2024-04-02
  • 使用CSS怎么实现一个波浪效果
    本篇文章为大家展示了使用CSS怎么实现一个波浪效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语言,主要是用来设计网页的样式,...
    99+
    2023-06-08
  • 使用css3怎么实现一个动感波浪效果
    使用css3怎么实现一个动感波浪效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一根矢量的波浪<svg viewBox="0 0&nb...
    99+
    2023-06-08
  • 聊聊怎么利用CSS实现波浪进度条效果
    (学习视频分享:web前端)以上就是聊聊怎么利用CSS实现波浪进度条效果的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    前端 CSS JavaScript
  • 怎么用android实现贝塞尔曲线之波浪效果
    这篇文章主要介绍“怎么用android实现贝塞尔曲线之波浪效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用android实现贝塞尔曲线之波浪效果”文章能帮助大家解决问题。1 前言贝塞尔曲线的...
    99+
    2023-07-02
  • 怎么在CSS中利用Houdini实现一个动态波浪纹效果
    怎么在CSS中利用Houdini实现一个动态波浪纹效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。css是什么意思css是一种用来表现HTML或XML等文件样式的计算机语...
    99+
    2023-06-08
  • 怎么用DIV+CSS实现仿电商网站导航条效果
    本篇内容主要讲解“怎么用DIV+CSS实现仿电商网站导航条效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用DIV+CSS实现仿电商网站导航条效果”吧!这...
    99+
    2024-04-02
  • 怎么用jQuery+html+css实现王者荣耀官网首页效果
    这篇文章主要介绍“怎么用jQuery+html+css实现王者荣耀官网首页效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用jQuery+html+css实现王者荣耀官网首页效果”文章能帮助大...
    99+
    2023-06-29
  • vue3怎么使用useMouseInElement实现图片局部放大预览效果
    本文小编为大家详细介绍“vue3怎么使用useMouseInElement实现图片局部放大预览效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3怎么使用useMouseInElement实现图片局部放大预览效果”文章能帮助大家解决...
    99+
    2023-07-05
  • 怎么用CSS3实现网易云孤独星球特效
    这篇“怎么用CSS3实现网易云孤独星球特效”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎...
    99+
    2024-04-02
  • 怎么用CSS实现美观大方的网页柱状图效果
    这篇文章主要介绍“怎么用CSS实现美观大方的网页柱状图效果”,在日常操作中,相信很多人在怎么用CSS实现美观大方的网页柱状图效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 怎么用纯CSS实现美观大方的网页柱状图效果
    小编给大家分享一下怎么用纯CSS实现美观大方的网页柱状图效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!代码如下:<!DOCTYPE html PUBLIC "-//W3...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作