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 相关文章推荐
ext combox 下拉框不出现自动提示,自动选中的解决方法
Feb 24 Javascript
jQuery之浮动窗口实现代码(两种方法)
Sep 08 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
May 23 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
Nov 17 Javascript
jQuery弹出层插件Lightbox_me使用指南
Apr 21 Javascript
Bootstrap布局方式详解
May 27 Javascript
JS作用域深度解析
Dec 29 Javascript
微信小程序之滚动视图容器的实现方法
Sep 26 Javascript
微信小程序实现tab切换效果
Nov 21 Javascript
详解vue表单——小白速看
Apr 08 Javascript
vuejs简单验证码功能完整示例
Jan 08 Javascript
vue获取时间戳转换为日期格式代码实例
Apr 17 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
一次编写,随处运行
2006/10/09 PHP
Godaddy空间Zend Optimizer升级方法
2010/05/10 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
2013/01/06 PHP
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
PHP实现数组array转换成xml的方法
2016/07/19 PHP
thinkphp分页集成实例
2017/07/24 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
js 判断js函数、变量是否存在的简单示例代码
2014/03/04 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
jquery获取复选框checkbox的值实现方法
2016/05/30 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
vue cli构建的项目中请求代理与项目打包问题
2018/02/26 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
JavaScript如何借用构造函数继承
2019/11/06 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
简述:我为什么选择Python而不是Matlab和R语言
2017/11/14 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
pyqt5 comboBox获得下标、文本和事件选中函数的方法
2019/06/14 Python
python实现PCA降维的示例详解
2020/02/24 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
学生操行评语大全
2014/04/24 职场文书
期末评语大全
2014/05/04 职场文书
我的中国梦口号
2014/06/16 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
红领巾广播站广播稿
2015/08/19 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
深入理解python多线程编程
2021/04/18 Python
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
vue中 this.$set的使用详解
2021/11/17 Vue.js