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


Posted in Javascript onSeptember 13, 2020

js实现3D粒子酷炫动态旋转特效(效果比较酷炫,中途不仅有形态的变换,还有颜色的变化,希望大家能够喜欢)

代码实现过程中的静态截图

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
 <TITLE> New Document </TITLE>
 <META NAME="Generator" CONTENT="EditPlus">
 <META NAME="Author" CONTENT="">
 <META NAME="Keywords" CONTENT="">
 <META NAME="Description" CONTENT="">
 <style>
 html,body{
 margin:0px;
 width:100%;
 height:100%;
 overflow:hidden;
 background:#000;
}

#canvas{
 position:absolute;
 width:100%;
 height:100%;
}

 </style>
 </HEAD>

 <BODY>
 <canvas id="canvas"></canvas>
 <script>
 function project3D(x,y,z,vars){

 var p,d;
 x-=vars.camX;
 y-=vars.camY-8;
 z-=vars.camZ;
 p=Math.atan2(x,z);
 d=Math.sqrt(x*x+z*z);
 x=Math.sin(p-vars.yaw)*d;
 z=Math.cos(p-vars.yaw)*d;
 p=Math.atan2(y,z);
 d=Math.sqrt(y*y+z*z);
 y=Math.sin(p-vars.pitch)*d;
 z=Math.cos(p-vars.pitch)*d;
 var rx1=-1000;
 var ry1=1;
 var rx2=1000;
 var ry2=1;
 var rx3=0;
 var ry3=0;
 var rx4=x;
 var ry4=z;
 var uc=(ry4-ry3)*(rx2-rx1)-(rx4-rx3)*(ry2-ry1);
 var ua=((rx4-rx3)*(ry1-ry3)-(ry4-ry3)*(rx1-rx3))/uc;
 var ub=((rx2-rx1)*(ry1-ry3)-(ry2-ry1)*(rx1-rx3))/uc;
 if(!z)z=0.000000001;
 if(ua>0&&ua<1&&ub>0&&ub<1){
 return {
 x:vars.cx+(rx1+ua*(rx2-rx1))*vars.scale,
 y:vars.cy+y/z*vars.scale,
 d:(x*x+y*y+z*z)
 };
 }else{
 return { d:-1 };
 }
}


function elevation(x,y,z){

 var dist = Math.sqrt(x*x+y*y+z*z);
 if(dist && z/dist>=-1 && z/dist <=1) return Math.acos(z / dist);
 return 0.00000001;
}


function rgb(col){

 col += 0.000001;
 var r = parseInt((0.5+Math.sin(col)*0.5)*16);
 var g = parseInt((0.5+Math.cos(col)*0.5)*16);
 var b = parseInt((0.5-Math.sin(col)*0.5)*16);
 return "#"+r.toString(16)+g.toString(16)+b.toString(16);
}


function interpolateColors(RGB1,RGB2,degree){
 
 var w2=degree;
 var w1=1-w2;
 return [w1*RGB1[0]+w2*RGB2[0],w1*RGB1[1]+w2*RGB2[1],w1*RGB1[2]+w2*RGB2[2]];
}


function rgbArray(col){

 col += 0.000001;
 var r = parseInt((0.5+Math.sin(col)*0.5)*256);
 var g = parseInt((0.5+Math.cos(col)*0.5)*256);
 var b = parseInt((0.5-Math.sin(col)*0.5)*256);
 return [r, g, b];
}


function colorString(arr){

 var r = parseInt(arr[0]);
 var g = parseInt(arr[1]);
 var b = parseInt(arr[2]);
 return "#"+("0" + r.toString(16) ).slice (-2)+("0" + g.toString(16) ).slice (-2)+("0" + b.toString(16) ).slice (-2);
}


function process(vars){


 if(vars.points.length<vars.initParticles) for(var i=0;i<5;++i) spawnParticle(vars);
 var p,d,t;
 
 p = Math.atan2(vars.camX, vars.camZ);
 d = Math.sqrt(vars.camX * vars.camX + vars.camZ * vars.camZ);
 d -= Math.sin(vars.frameNo / 80) / 25;
 t = Math.cos(vars.frameNo / 300) / 165;
 vars.camX = Math.sin(p + t) * d;
 vars.camZ = Math.cos(p + t) * d;
 vars.camY = -Math.sin(vars.frameNo / 220) * 15;
 vars.yaw = Math.PI + p + t;
 vars.pitch = elevation(vars.camX, vars.camZ, vars.camY) - Math.PI / 2;
 
 var t;
 for(var i=0;i<vars.points.length;++i){
 
 x=vars.points[i].x;
 y=vars.points[i].y;
 z=vars.points[i].z;
 d=Math.sqrt(x*x+z*z)/1.0075;
 t=.1/(1+d*d/5);
 p=Math.atan2(x,z)+t;
 vars.points[i].x=Math.sin(p)*d;
 vars.points[i].z=Math.cos(p)*d;
 vars.points[i].y+=vars.points[i].vy*t*((Math.sqrt(vars.distributionRadius)-d)*2);
 if(vars.points[i].y>vars.vortexHeight/2 || d<.25){
 vars.points.splice(i,1);
 spawnParticle(vars);
 }
 }
}

function drawFloor(vars){
 
 var x,y,z,d,point,a;
 for (var i = -25; i <= 25; i += 1) {
 for (var j = -25; j <= 25; j += 1) {
 x = i*2;
 z = j*2;
 y = vars.floor;
 d = Math.sqrt(x * x + z * z);
 point = project3D(x, y-d*d/85, z, vars);
 if (point.d != -1) {
 size = 1 + 15000 / (1 + point.d);
 a = 0.15 - Math.pow(d / 50, 4) * 0.15;
 if (a > 0) {
  vars.ctx.fillStyle = colorString(interpolateColors(rgbArray(d/26-vars.frameNo/40),[0,128,32],.5+Math.sin(d/6-vars.frameNo/8)/2));
  vars.ctx.globalAlpha = a;
  vars.ctx.fillRect(point.x-size/2,point.y-size/2,size,size);
 }
 }
 }
 } 
 vars.ctx.fillStyle = "#82f";
 for (var i = -25; i <= 25; i += 1) {
 for (var j = -25; j <= 25; j += 1) {
 x = i*2;
 z = j*2;
 y = -vars.floor;
 d = Math.sqrt(x * x + z * z);
 point = project3D(x, y+d*d/85, z, vars);
 if (point.d != -1) {
 size = 1 + 15000 / (1 + point.d);
 a = 0.15 - Math.pow(d / 50, 4) * 0.15;
 if (a > 0) {
  vars.ctx.fillStyle = colorString(interpolateColors(rgbArray(-d/26-vars.frameNo/40),[32,0,128],.5+Math.sin(-d/6-vars.frameNo/8)/2));
  vars.ctx.globalAlpha = a;
  vars.ctx.fillRect(point.x-size/2,point.y-size/2,size,size);
 }
 }
 }
 } 
}

function sortFunction(a,b){
 return b.dist-a.dist;
}

function draw(vars){

 vars.ctx.globalAlpha=.15;
 vars.ctx.fillStyle="#000";
 vars.ctx.fillRect(0, 0, canvas.width, canvas.height);
 
 drawFloor(vars);
 
 var point,x,y,z,a;
 for(var i=0;i<vars.points.length;++i){
 x=vars.points[i].x;
 y=vars.points[i].y;
 z=vars.points[i].z;
 point=project3D(x,y,z,vars);
 if(point.d != -1){
 vars.points[i].dist=point.d;
 size=1+vars.points[i].radius/(1+point.d);
 d=Math.abs(vars.points[i].y);
 a = .8 - Math.pow(d / (vars.vortexHeight/2), 1000) * .8;
 vars.ctx.globalAlpha=a>=0&&a<=1?a:0;
 vars.ctx.fillStyle=rgb(vars.points[i].color);
 if(point.x>-1&&point.x<vars.canvas.width&&point.y>-1&&point.y<vars.canvas.height)vars.ctx.fillRect(point.x-size/2,point.y-size/2,size,size);
 }
 }
 vars.points.sort(sortFunction);
}


function spawnParticle(vars){

 var p,ls;
 pt={};
 p=Math.PI*2*Math.random();
 ls=Math.sqrt(Math.random()*vars.distributionRadius);
 pt.x=Math.sin(p)*ls;
 pt.y=-vars.vortexHeight/2;
 pt.vy=vars.initV/20+Math.random()*vars.initV;
 pt.z=Math.cos(p)*ls;
 pt.radius=200+800*Math.random();
 pt.color=pt.radius/1000+vars.frameNo/250;
 vars.points.push(pt); 
}

function frame(vars) {

 if(vars === undefined){
 var vars={};
 vars.canvas = document.querySelector("canvas");
 vars.ctx = vars.canvas.getContext("2d");
 vars.canvas.width = document.body.clientWidth;
 vars.canvas.height = document.body.clientHeight;
 window.addEventListener("resize", function(){
 vars.canvas.width = document.body.clientWidth;
 vars.canvas.height = document.body.clientHeight;
 vars.cx=vars.canvas.width/2;
 vars.cy=vars.canvas.height/2;
 }, true);
 vars.frameNo=0;

 vars.camX = 0;
 vars.camY = 0;
 vars.camZ = -14;
 vars.pitch = elevation(vars.camX, vars.camZ, vars.camY) - Math.PI / 2;
 vars.yaw = 0;
 vars.cx=vars.canvas.width/2;
 vars.cy=vars.canvas.height/2;
 vars.bounding=10;
 vars.scale=500;
 vars.floor=26.5;

 vars.points=[];
 vars.initParticles=2000;
 vars.initV=.01;
 vars.distributionRadius=800;
 vars.vortexHeight=25;
 }

 vars.frameNo++;
 requestAnimationFrame(function() {
 frame(vars);
 });

 process(vars);
 draw(vars);
}
frame();

 </script>
 </BODY>
</HTML>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript学习笔记(十七)js 优化
Feb 04 Javascript
Jquery优化效率 提升性能解决方案
Sep 06 Javascript
js改变img标签的src属性在IE下没反应的解决方法
Jul 23 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
May 14 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
javascript、php关键字搜索函数的使用方法
May 29 Javascript
vue-router 源码之实现一个简单的 vue-router
Jul 02 Javascript
详解JavaScript的变量
Apr 04 Javascript
vue导航栏部分的动态渲染实例
Nov 01 Javascript
Vue组件通信入门之Provide和Inject机制
Dec 29 Javascript
详解Vite的新体验
Feb 22 Javascript
原生JS实现九宫格抽奖
Sep 13 #Javascript
jQuery实现带进度条的轮播图
Sep 13 #jQuery
js+canvas实现画板功能
Sep 13 #Javascript
jQuery实现鼠标拖拽登录框移动效果
Sep 13 #jQuery
jQuery实现简单全选框
Sep 13 #jQuery
jQuery+ajax实现用户登录验证
Sep 13 #jQuery
js+audio实现音乐播放器
Sep 13 #Javascript
You might like
如何使用php绘制在图片上的正余弦曲线
2013/06/08 PHP
php json_encode值中大括号与花括号区别
2013/09/30 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP实现简易计算器功能
2020/08/28 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
用jQuery打造TabPanel效果代码
2010/05/22 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
通过location.replace禁止浏览器后退防止重复提交
2014/09/04 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
JS制作简单的三级联动
2015/03/18 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
2016/03/07 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
numpy实现合并多维矩阵、list的扩展方法
2018/05/08 Python
在Pycharm中执行scrapy命令的方法
2019/01/16 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
Europcar比利时:租车
2019/08/26 全球购物
Linux文件操作命令都有哪些
2016/07/23 面试题
大学生护理专业自荐信
2013/10/03 职场文书
经济管理自荐书
2014/06/09 职场文书
宣传活动总结范文
2014/07/01 职场文书
销售人员工作自我评价
2014/09/21 职场文书
确保工程质量承诺书
2015/04/29 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python