canvas实现脉冲爆炸飞舞粒子效果代码
代码语言:html
所属分类:粒子
代码描述:canvas实现脉冲爆炸飞舞粒子效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="UTF-8">
<style>
body,html{
background: #000;
margin: 0;
height: 100vh;
overflow: hidden;
}
#c{
background:#fff;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
</style>
</head>
<body>
<canvas id=c>
<script >
c = document.querySelector('#c');
c.width = 1920;
c.height = 1080;
x = c.getContext('2d');
C = Math.cos;
S = Math.sin;
t = 0;
T = Math.tan;
rsz = window.onresize = () => {
setTimeout(() => {
if (document.body.clientWidth > document.body.clientHeight * 1.77777778) {
c.style.height = '100vh';
setTimeout(() => c.style.width = c.clientHeight * 1.77777778 + 'px', 0);
} else {
c.style.width = '100vw';
setTimeout(() => c.style.height = c.clientWidth / 1.77777778 + 'px', 0);
}
}, 0);
};
rsz();
async function Draw() {
if (!t) {
R = (Rl, Pt, Yw, m) => {
M = Math;
A = M.atan2;
H = M.hypot;
X = S(p = A(X, Y) + Rl) * (d = H(X, Y));
Y = C(p) * d;
X = S(p = A(X, Z) + Yw) * (d = H(X, Z));
Z = C(p) * d;
Y = S(p = A(Y, Z) + Pt) * (d = H(Y, Z));
Z = C(p) * d;
if (m) {
X += oX;
Y += oY;
Z += oZ;
}
};
Q = () => [c.width / 2 + X / Z * 400, c.height / 2 + Y / Z * 400];
I = (A, B, M, D, E, F, G, H) => (K = ((G - E) * (B - F) - (H - F) * (A - E)) / (J = (H - F) * (M - A) - (G - E) * (D - B))) >= 0 && K <= 1 && (L = ((M - A) * (B - F) - (D - B) * (A - E)) / J) >= 0 && L <= 1 ? [A + K * (M - A), B + K * (D - B)] : 0;
Rn = Math.random;
geoSphere = (mx, my, mz, iBc, size) => {
let collapse = 0;
let B = Array(iBc).fill().map(v => {
X = Rn() - .5;
Y = Rn() - .5;
Z = Rn() - .5;
return [X, Y, Z];
});
for (let m = 99; m--;) {
B.map((v, i) => {
X = v[0];
Y = v[1];
Z = v[2];
B.map((q, j) => {
if (j != i) {
X2 = q[0];
Y2 = q[1];
Z2 = q[2];
d = 1 + (Math.hypot(X - X2, Y - Y2, Z - Z2) * (3 + iBc / 40) * 3) ** 4;
X += (X - X2) * 99 / d;
Y += (Y - Y2) * 99 / d;
Z += (Z - Z2) * 99 / d;
}
});
d = Math.hypot(X, Y, Z);
v[0] = X / d;
v[1] = Y / d;
v[2] = Z / d;
if (collapse) {
d = 25 + Math.hypot(X, Y, Z);
v[0] = (X - X / d) / 1.1;
v[1] = (Y - Y / d) / 1.1;
v[2] = (Z - Z / d) / 1.1;
}
});
}
B.map(v => {
v[0] *= size;
v[1] *= size;
v[2] *= size;
v[0] += mx;
v[1] += my;
v[2] += mz;
});
return [mx, my, mz, size, B];
};
Cylinder = (rw, cl, ls1, ls2) => {
let a = [];
for (let i = rw; i--;) {
let b = [];
for (let j = cl; j--;) {
X = S(p = Math.PI * 2 / cl * j) * ls1;
Y = (1 / rw * i - .5) * ls2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
}
//a = [...a, b]
for (let j = cl; j--;) {
b = [];
X = S(p = Math.PI * 2 / cl * j) * ls1;
Y = (1 / rw * i - .5) * ls2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
X = S(p = Math.PI * 2 / cl * (j + 1)) * ls1;
Y = (1 / rw * i - .5) * ls2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
X = S(p = Math.PI * 2 / cl * (j + 1)) * ls1;
Y = (1 / rw * (i + 1) - .5) * ls2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
X = S(p = Math.PI * 2 / cl * j) * ls1;
Y = (1 / rw * (i + 1) - .5) * ls2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
a = [...a, b];
}
}
b = [];
for (let j = cl; j--;) {
X = S(p = Math.PI * 2 / cl * j) * ls1;
Y = ls2 / 2;
Z = C(p) * ls1;
b = [...b, [X, Y, Z]];
}
//a = [...a, b]
return a;
};
Tetrahedron = size => {
ret = [];
a = [];
let h = size / 1.4142 / 1.25;
for (i = 3; i--;) {
X = S(p = Math.PI * 2 / 3 * i) * size / 1.25;
Y = C(p) * size / 1.25;
Z = h;
a = [...a, [X, Y, Z]];
}
ret = [...ret, a];
for (j = 3; j--;) {
a = [];
X = 0;
Y = 0;
Z = -h;
a = [...a, [X, Y, Z]];
X = S(p = Math.PI * 2 / 3 * j) * size / 1.25;
Y = C(p) * size / 1.25;
Z = h;
a = [...a, [X, Y, Z]];
X = S(p = Math.PI * 2 / 3 * (j + 1)) * size / 1.25;
Y = C(p) * size / 1.25;
Z = h;
a = [...a, [X, Y, Z]];
ret = [...ret, a];
}
ax = ay = az = ct = 0;
ret.map(v => {
v.map(q => {
ax += q[0];
ay += q[1];
az += q[2];
ct++;
});
});
ax /= ct;
ay /= ct;
az /= ct;
ret.map(v => {
v.map(q => {
q[0] -= ax;
q[1] -= ay;
q[2] -= az;
});
});
return ret;
};
Cube = size => {
for (CB = [], j = 6; j--; CB = [...CB, b]) for (b = [], i = 4; i--;) b = [...b, [(a = [S(p = Math.PI * 2 / 4 * i + Math.PI / 4), C(p), 2 ** .5 / 2])[j % 3] * (l = j < 3 ? size / 1.5 : -size / 1.5), a[(j + 1) % 3] * l, a[(j + 2) % 3] * l]];
return CB;
};
Octahedron = size => {
ret = [];
let h = size / 1.25;
for (j = 8; j--;) {
a = [];
X = 0;
Y = 0;
Z = h * (j < 4 ? -1 : 1);
a = [...a, [X, Y, Z]];
X = S(p = Math.PI * 2 / 4 * j) * size / 1.25;
Y = C(p) * size / 1.25;
Z = 0;
a = [...a, [X, Y, Z]];
X = S(p = Math.PI * 2 / 4 * (j + 1)) * size / 1.25;
Y = C(p) * size / 1.25;
Z = 0;
a = [...a, [X, Y, Z]];
ret = [...ret, a];
}
return ret;
};
Dodecahedron = size => {
ret = [];
a = [];
mind = -6e6;
for (i = 5; i--;) {
X = S(p = Math.PI * 2 / 5 * i + Math.PI / 5);
Y = C(p);
Z = 0;
if (Y > mind) mind = Y;
a = [...a, [X, Y, Z]];
}
a.map(v => {
X = v[0];
Y = v[1] -= mind;
Z = v[2];
R(0, .553573, 0);
v[0] = X;
v[1] = Y;
v[.........完整代码请登录后点击上方下载按钮下载查看
网友评论0