基于canvas的粒子酷炫效果

简介: 基于canvas的粒子酷炫效果,可用作可视化大屏的背景展示,即拿即用......
<html><head><metacharset="utf-8"><title>www.husonghe.com</title><style>html {
height: 100%;
background-image: -webkit-radial-gradient(ellipsefarthest-corneratcentercenter, #1b44e4 0%, #020f3a 100%);background-image: radial-gradient(ellipsefarthest-corneratcentercenter, #1b44e4 0%, #020f3a 100%);cursor: move;
    }
body {
width: 100%;
margin: 0;
overflow: hidden;
    }
</style></head><body><canvasid="canv"width="1920"height="572"></canvas><script>varnum=200;
varw=window.innerWidth;
varh=window.innerHeight;
varmax=100;
var_x=0;
var_y=0;
var_z=150;
vardtr=function (d) {
returnd*Math.PI/180;
    };
varrnd=function () {
returnMath.sin(Math.floor(Math.random() *360) *Math.PI/180);
    };
vardist=function (p1, p2, p3) {
returnMath.sqrt(Math.pow(p2.x-p1.x, 2) +Math.pow(p2.y-p1.y, 2) +Math.pow(p2.z-p1.z, 2));
    };
varcam= {
obj: {
x: _x,
y: _y,
z: _z      },
dest: {
x: 0,
y: 0,
z: 1      },
dist: {
x: 0,
y: 0,
z: 200      },
ang: {
cplane: 0,
splane: 0,
ctheta: 0,
stheta: 0      },
zoom: 1,
disp: {
x: w/2,
y: h/2,
z: 0      },
upd: function () {
cam.dist.x=cam.dest.x-cam.obj.x;
cam.dist.y=cam.dest.y-cam.obj.y;
cam.dist.z=cam.dest.z-cam.obj.z;
cam.ang.cplane=-cam.dist.z/Math.sqrt(cam.dist.x*cam.dist.x+cam.dist.z*cam.dist.z);
cam.ang.splane=cam.dist.x/Math.sqrt(cam.dist.x*cam.dist.x+cam.dist.z*cam.dist.z);
cam.ang.ctheta=Math.sqrt(cam.dist.x*cam.dist.x+cam.dist.z*cam.dist.z) /Math.sqrt(cam.dist.x*cam.dist.x+cam.dist.y*cam.dist.y+cam.dist.z*cam.dist.z);
cam.ang.stheta=-cam.dist.y/Math.sqrt(cam.dist.x*cam.dist.x+cam.dist.y*cam.dist.y+cam.dist.z*cam.dist.z);
      }
    };
vartrans= {
parts: {
sz: function (p, sz) {
return {
x: p.x*sz.x,
y: p.y*sz.y,
z: p.z*sz.z          };
        },
rot: {
x: function (p, rot) {
return {
x: p.x,
y: p.y*Math.cos(dtr(rot.x)) -p.z*Math.sin(dtr(rot.x)),
z: p.y*Math.sin(dtr(rot.x)) +p.z*Math.cos(dtr(rot.x))
            };
          },
y: function (p, rot) {
return {
x: p.x*Math.cos(dtr(rot.y)) +p.z*Math.sin(dtr(rot.y)),
y: p.y,
z: -p.x*Math.sin(dtr(rot.y)) +p.z*Math.cos(dtr(rot.y))
            };
          },
z: function (p, rot) {
return {
x: p.x*Math.cos(dtr(rot.z)) -p.y*Math.sin(dtr(rot.z)),
y: p.x*Math.sin(dtr(rot.z)) +p.y*Math.cos(dtr(rot.z)),
z: p.z            };
          }
        },
pos: function (p, pos) {
return {
x: p.x+pos.x,
y: p.y+pos.y,
z: p.z+pos.z          };
        }
      },
pov: {
plane: function (p) {
return {
x: p.x*cam.ang.cplane+p.z*cam.ang.splane,
y: p.y,
z: p.x*-cam.ang.splane+p.z*cam.ang.cplane          };
        },
theta: function (p) {
return {
x: p.x,
y: p.y*cam.ang.ctheta-p.z*cam.ang.stheta,
z: p.y*cam.ang.stheta+p.z*cam.ang.ctheta          };
        },
set: function (p) {
return {
x: p.x-cam.obj.x,
y: p.y-cam.obj.y,
z: p.z-cam.obj.z          };
        }
      },
persp: function (p) {
return {
x: p.x*cam.dist.z/p.z*cam.zoom,
y: p.y*cam.dist.z/p.z*cam.zoom,
z: p.z*cam.zoom,
p: cam.dist.z/p.z        };
      },
disp: function (p, disp) {
return {
x: p.x+disp.x,
y: -p.y+disp.y,
z: p.z+disp.z,
p: p.p        };
      },
steps: function (_obj_, sz, rot, pos, disp) {
var_args=trans.parts.sz(_obj_, sz);
_args=trans.parts.rot.x(_args, rot);
_args=trans.parts.rot.y(_args, rot);
_args=trans.parts.rot.z(_args, rot);
_args=trans.parts.pos(_args, pos);
_args=trans.pov.plane(_args);
_args=trans.pov.theta(_args);
_args=trans.pov.set(_args);
_args=trans.persp(_args);
_args=trans.disp(_args, disp);
return_args;
      }
    };
    (function () {
"use strict";
varthreeD=function (param) {
this.transIn= {};
this.transOut= {};
this.transIn.vtx= (param.vtx);
this.transIn.sz= (param.sz);
this.transIn.rot= (param.rot);
this.transIn.pos= (param.pos);
      };
threeD.prototype.vupd=function () {
this.transOut=trans.steps(
this.transIn.vtx,
this.transIn.sz,
this.transIn.rot,
this.transIn.pos,
cam.disp        );
      };
varBuild=function () {
this.vel=0.04;
this.lim=360;
this.diff=200;
this.initPos=100;
this.toX=_x;
this.toY=_y;
this.go();
      };
Build.prototype.go=function () {
this.canvas=document.getElementById("canv");
this.canvas.width=window.innerWidth;
this.canvas.height=window.innerHeight;
this.$=canv.getContext("2d");
this.$.globalCompositeOperation='source-over';
this.varr= [];
this.dist= [];
this.calc= [];
for (vari=0, len=num; i<len; i++) {
this.add();
        }
this.rotObj= {
x: 0,
y: 0,
z: 0        };
this.objSz= {
x: w/5,
y: h/5,
z: w/5        };
      };
Build.prototype.add=function () {
this.varr.push(newthreeD({
vtx: {
x: rnd(),
y: rnd(),
z: rnd()
          },
sz: {
x: 0,
y: 0,
z: 0          },
rot: {
x: 20,
y: -20,
z: 0          },
pos: {
x: this.diff*Math.sin(360*Math.random() *Math.PI/180),
y: this.diff*Math.sin(360*Math.random() *Math.PI/180),
z: this.diff*Math.sin(360*Math.random() *Math.PI/180)
          }
        }));
this.calc.push({
x: 360*Math.random(),
y: 360*Math.random(),
z: 360*Math.random()
        });
      };
Build.prototype.upd=function () {
cam.obj.x+= (this.toX-cam.obj.x) *0.05;
cam.obj.y+= (this.toY-cam.obj.y) *0.05;
      };
Build.prototype.draw=function () {
this.$.clearRect(0, 0, this.canvas.width, this.canvas.height);
cam.upd();
this.rotObj.x+=0.1;
this.rotObj.y+=0.1;
this.rotObj.z+=0.1;
for (vari=0; i<this.varr.length; i++) {
for (varvalinthis.calc[i]) {
if (this.calc[i].hasOwnProperty(val)) {
this.calc[i][val] +=this.vel;
if (this.calc[i][val] >this.lim) this.calc[i][val] =0;
            }
          }
this.varr[i].transIn.pos= {
x: this.diff*Math.cos(this.calc[i].x*Math.PI/180),
y: this.diff*Math.sin(this.calc[i].y*Math.PI/180),
z: this.diff*Math.sin(this.calc[i].z*Math.PI/180)
          };
this.varr[i].transIn.rot=this.rotObj;
this.varr[i].transIn.sz=this.objSz;
this.varr[i].vupd();
if (this.varr[i].transOut.p<0) continue;
varg=this.$.createRadialGradient(this.varr[i].transOut.x, this.varr[i].transOut.y, this.varr[i].transOut.p, this.varr[i].transOut.x, this.varr[i].transOut.y, this.varr[i].transOut.p*2);
this.$.globalCompositeOperation='lighter';
g.addColorStop(0, 'hsla(255, 255%, 255%, 1)');
g.addColorStop(.5, 'hsla('+ (i+2) +',85%, 40%,1)');
g.addColorStop(1, 'hsla('+ (i) +',85%, 40%,.5)');
this.$.fillStyle=g;
this.$.beginPath();
this.$.arc(this.varr[i].transOut.x, this.varr[i].transOut.y, this.varr[i].transOut.p*2, 0, Math.PI*2, false);
this.$.fill();
this.$.closePath();
        }
      };
Build.prototype.anim=function () {
window.requestAnimationFrame= (function () {
returnwindow.requestAnimationFrame||function (callback, element) {
window.setTimeout(callback, 1000/60);
            };
        })();
varanim=function () {
this.upd();
this.draw();
window.requestAnimationFrame(anim);
        }.bind(this);
window.requestAnimationFrame(anim);
      };
Build.prototype.run=function () {
this.anim();
window.addEventListener('mousemove', function (e) {
this.toX= (e.clientX-this.canvas.width/2) *-0.8;
this.toY= (e.clientY-this.canvas.height/2) *0.8;
        }.bind(this));
window.addEventListener('touchmove', function (e) {
e.preventDefault();
this.toX= (e.touches[0].clientX-this.canvas.width/2) *-0.8;
this.toY= (e.touches[0].clientY-this.canvas.height/2) *0.8;
        }.bind(this));
window.addEventListener('mousedown', function (e) {
for (vari=0; i<100; i++) {
this.add();
          }
        }.bind(this));
window.addEventListener('touchstart', function (e) {
e.preventDefault();
for (vari=0; i<100; i++) {
this.add();
          }
        }.bind(this));
      };
varapp=newBuild();
app.run();
    })();
window.addEventListener('resize', function () {
canvas.width=w=window.innerWidth;
canvas.height=h=window.innerHeight;
    }, false);
</script></body></html>
目录
相关文章
|
11月前
|
安全 Java 数据库连接
如何理解反射
反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。
153 20
|
7月前
|
人工智能 自然语言处理 供应链
AI直播销售奇迹:00后DeepSeek的3.3亿真相探究
近日,“00后主播借DeepSeek技术直播卖出3.3亿”的新闻引发关注。此次成功不仅得益于主播个人魅力,更离不开“交个朋友”直播间团队对AI技术的深度融合。通过DeepSeek大模型,AI在内容生成、流程优化等方面大幅提升效率,实现了直播话术自动生成、多场景适配及全球化支持。团队还利用AI进行选品、合规审核和数据分析,优化直播策略。多位主播精细分工,结合强大的背景资源,确保高效带货。AI与真人主播互补,提升转化率。尽管存在版权、就业等争议,此次销售奇迹展示了AI技术商业化的潜力,并为行业提供了宝贵案例。
245 0
|
12月前
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
自然语言处理 算法 图形学
几分钟生成四维内容,还能控制运动效果:北大、密歇根提出DG4D
【7月更文挑战第25天】北京大学与密歇根大学合作提出DreamGaussian4D (DG4D),解决四维内容生成中的挑战,如长时间优化、运动控制及细节质量。DG4D结合几何变换与Gaussian Splatting,大幅减少优化时间至几分钟,并增强了运动的可控性与细节质量。此框架包括Image-to-4D GS模块和Video-to-Video Texture Refinement模块,分别负责高质量四维内容生成和纹理精细化。[论文](https://arxiv.org/abs/2312.17142)
200 1
|
物联网
什么是动态发射功率控制 (DTPC)?
【8月更文挑战第24天】
1437 0
|
消息中间件 存储 缓存
Linux内存映射mmap
Linux内存映射mmap
199 0
|
算法 安全 Java
18-动态对象年龄判断+空间分配担保规则+老年代回收算法
本文中用到的案例是接着上一篇文章继续的,如果有不清楚同学请先查看上一篇文章
249 0
 18-动态对象年龄判断+空间分配担保规则+老年代回收算法
|
存储 Java 测试技术
Nacos架构与原理 - 配置模型
Nacos架构与原理 - 配置模型
512 0
|
Oracle 关系型数据库
mac 安装virtualbox虚拟机
mac 安装virtualbox虚拟机
515 3
mac 安装virtualbox虚拟机
|
开发框架 监控 Cloud Native
阿里云与润和软件完成产品集成认证,携手共建金融行业新生态
近日,润和软件的数据交换平台(V1.0)与阿里云计算有限公司的云数据库RDS MySQL版、阿里云专有云企业版等产品经过严格测试程序完成认证测试。
860 0
阿里云与润和软件完成产品集成认证,携手共建金融行业新生态