js实现3D粒子酷炫动态旋转特效

实现3D粒子酷炫动态旋转特效,需要以下几个步骤:

1.创建canvas画布和粒子对象数组;
2.为粒子对象添加随机坐标、颜色以及速度;
3.绘制粒子,并实现动态旋转效果;
4.根据屏幕大小更新粒子位置。

下面,我将详细解释每个步骤并且提供具体的代码示例。

  1. 创建canvas画布和粒子对象数组。
    首先,我们需要创建一个HTML文件,添加一张背景图片,然后再创建一个canvas画布,使用canvas API绘制粒子。
<!DOCTYPE html>
<html>
<head>
  <title>3D粒子酷炫动态旋转特效</title>
</head>
<body>
  <div id="particles-container"></div>
  <canvas id="particles-canvas"></canvas>
  <script src="index.js"></script>
</body>
</html>

在JavaScript中,我们要定义一个Particle类,用于保存每个粒子对象的状态和位置,代码如下:

class Particle {
  constructor(x, y, z, speed) {
    this.x = x;          //粒子x坐标
    this.y = y;          //粒子y坐标
    this.z = z;          //粒子z坐标
    this.speed = speed;      //粒子速度
    this.color = "#fff";      //粒子颜色
  }
}

我们还需要定义一个数组来保存粒子对象的状态,代码如下:

let particles = [];
  1. 为粒子对象添加随机坐标、颜色以及速度
    接下来,我们使用随机数生成器生成一些随机的颜色、坐标和速度,然后将其添加到粒子对象数组中。代码如下:
for (let i = 0; i < 1000; i++) {
  let x = Math.random() * canvas.width - canvas.width / 2;
  let y = Math.random() * canvas.height - canvas.height / 2;
  let z = Math.random() * 3000 - 1500;
  let speed = Math.random() * 10;
  let particle = new Particle(x, y, z, speed);

  //随机颜色
  let hue = Math.floor(Math.random() * 360);
  particle.color = `hsl(${hue}, 100%, 50%)`;

  //将粒子加入数组
  particles.push(particle);
}
  1. 绘制粒子,并实现动态旋转效果
    我们需要实现一个函数来绘制粒子。在绘制之前,需要设置画布的背景颜色,然后绘制每个粒子。我们可以使用fillRect方法来绘制每个粒子的位置和颜色,代码如下:
function drawParticles() {
  context.clearRect(0, 0, canvas.width, canvas.height);    //清除画布
  context.fillStyle = "rgba(0, 0, 0, 0.1)";                //设置画布背景颜色
  context.fillRect(0, 0, canvas.width, canvas.height);     //绘制画布背景

  //遍历粒子数组并绘制每个粒子
  for (let i = 0; i < particles.length; i++) {
    let particle = particles[i];

    //旋转粒子
    particle.x = particle.x * Math.cos(0.01) + particle.z * Math.sin(0.01);
    particle.z = particle.z * Math.cos(0.01) - particle.x * Math.sin(0.01);

    //绘制粒子
    context.fillStyle = particle.color;
    context.beginPath();
    let factor = 1000 / (1000 + particle.z);
    context.arc(canvas.width / 2 + particle.x * factor, canvas.height / 2 + particle.y * factor, 3 * factor, 0, Math.PI * 2);
    context.fill();
  }
}

代码解释:
为了实现动态旋转效果,我们需要在每次绘制粒子之前旋转粒子的坐标。在绘制时候,我们使用了x坐标和z坐标的三角函数值去更新坐标,增加动态旋转效果。

  1. 根据屏幕大小更新粒子位置
    最后,我们需要根据屏幕大小更新粒子的位置。当用户调整浏览器窗口大小时,我们需要重新计算每个粒子的位置。代码如下:
function updateCanvasSize() {
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  //将粒子回归屏幕中央
  for (let i = 0; i < particles.length; i++) {
    let particle = particles[i];
    let x = Math.random() * canvas.width - canvas.width / 2;
    let y = Math.random() * canvas.height - canvas.height / 2;
    let z = Math.random() * 3000 - 1500;
    particle.x = x;
    particle.y = y;
    particle.z = z;
  }
}

代码解释:
当窗口大小被调整时,我们使用window.innerWidth和window.innerHeight获取新的窗口大小,并重新设置canvas的高度和宽度。接下来,我们使用Math.random()方法生成一个随机的位置和深度,将每个粒子的位置重置到中心处。

示例1:

请看这个演示链接:https://codepen.io/collection/DVNgzy

示例2:

你也可以使用p5.js来实现3D粒子酷炫动态旋转特效,具体实现方式与上述示例相似。

let particles = [];

function setup() {
    createCanvas(windowWidth, windowHeight);
    for(let i = 0; i < 100; i++) {
        let x = random(-width/2, width/2);
        let y = random(-height/2, height/2);
        let z = random(-1000, 1000);
        let speed = random(1, 5);
        let particle = new Particle(x, y, z, speed);
        let hue = random(0, 360);
        particle.color = color(`hsl(${hue}, 100%, 50%)`);
        particles.push(particle);
    }
}

function draw() {
    background(0, 0, 0, 50);
    translate(width/2, height/2);

    for(let i = 0; i < particles.length; i++) {
        let particle = particles[i];
        particle.x = particle.x * cos(0.01) + particle.z * sin(0.01);
        particle.z = particle.z * cos(0.01) - particle.x * sin(0.01);

        let factor = 1000/(1000+particle.z);
        let size = 3 * factor;
        fill(particle.color);
        noStroke();
        circle(particle.x * factor, particle.y * factor, size);
    }
}

function windowResized() {
    resizeCanvas(windowWidth, windowHeight);
    setup();
}

可以看出该代码和第一个示例非常相似,只不过使用的是p5.js库来实现3D粒子酷炫动态旋转特效,更加方便易用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js实现3D粒子酷炫动态旋转特效 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • Vue实现调用PC端摄像头实时拍照

    下面我来详细讲解一下Vue实现调用PC端摄像头实时拍照的完整攻略。 1. 获取用户的设备权限和相机设备 在Vue中将调用PC端摄像头分为两步,首先是获取用户的设备权限和相机设备。 //获取用户媒体设备(摄像头) if (navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserM…

    JavaScript 2023年6月11日
    00
  • JS正则中的match与exec使用说明

    JS正则中的match与exec使用说明攻略: 一、前言 在 JavaScript 中,正则表达式是一种非常强大的工具,可以用于字符串匹配、替换等操作。JS正则中的 match 与 exec 方法是两个常用的正则匹配方法。本文将详细讲解这两个方法并提供实例说明。 二、match 方法 match 方法是 String 对象的方法,用来返回与正则表达式匹配的字…

    JavaScript 2023年6月10日
    00
  • Chrome中JSON.parse的特殊实现

    谈论Chrome中JSON.parse的特殊实现需要先了解JSON.stringify()和JSON.parse()这两个API的作用。其中,JSON.stringify()可以将一个JavaScript对象或数组转换成一个JSON字符串,而JSON.parse()则可以将JSON字符串转化为JavaScript对象或数组。 我们来看一个例子: var ob…

    JavaScript 2023年5月27日
    00
  • 详解JS内存空间

    下面是详解JS内存空间的完整攻略。 什么是JS内存空间 JS内存空间是指JS程序运行时候所使用的内存区域。这个内存区域分为两个部分:栈内存和堆内存。在JS程序运行时,变量和函数都要被存储在内存空间中,以便被调用和使用。 栈内存和堆内存 栈内存 栈内存是以FIFO(先进先出)的方式存储数据的,它的存储方式和变量的生命周期有关系。当一个函数被调用时,会自动在栈内…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript函数参数(推荐)

    深入理解JavaScript函数参数(推荐) 在JavaScript中,函数参数是一个重要的概念,函数的可用性和实用性很大程度上依赖于参数。在本文中,我们将介绍JavaScript函数参数的各种方面,包括: 位置参数 默认参数 剩余参数 命名参数 参数解构 位置参数 位置参数是函数定义中的参数,它们的值由调用函数时传递的参数值确定。例如: function …

    JavaScript 2023年5月27日
    00
  • JS变量中有var定义和无var定义的区别以及es6中let命令和const命令

    JS变量中有var定义和无var定义的区别 在Javascript中,有使用var定义变量和不使用var直接定义变量两种方式。 1. 使用var定义变量 使用var定义的变量会存在变量提升,即在变量声明之前,该变量也可以被访问到。这种定义方式的变量作用域是该变量所在的函数作用域(如果在函数内定义)或全局作用域(如果在函数外定义)。 示例1:使用var定义变量…

    JavaScript 2023年6月10日
    00
  • 快速理解 JavaScript 中的 LHS 和 RHS 查询的用法

    快速理解 JavaScript 中的 LHS 和 RHS 查询的用法 在 JavaScript 中,LHS(左手边)查询和 RHS(右手边)查询是非常常见的两种查询形式。这两种查询都是 JavaScript 执行引擎在运行代码时所使用的,理解这两种查询的用法对于编写高质量的 JavaScript 代码非常重要。 LHS 查询 LHS 查询通常发生在变量赋值时…

    JavaScript 2023年6月11日
    00
  • 基于js 各种排序方法和sort方法的区别(详解)

    针对“基于js 各种排序方法和sort方法的区别(详解)”这个话题,我将从以下几个方面进行详细讲解。 一、基础排序算法 在介绍各种排序算法之前,我们先了解一下几个基础排序算法:冒泡排序、插入排序和选择排序。 1. 冒泡排序 冒泡排序的基本思路是比较相邻的元素,如果前面的元素比后面的大,则交换这两个元素。每完成一轮比较,就可以确定一个最大的元素,并且这个最大的…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部