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:#000; 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, 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; X = S(p = A(X, Y) + Rl) * (d = H(X, Y)); Y = C(p) * d; if (m) { X += oX; Y += oY; Z += oZ; } }; Q = () => [c.width / 2 + X / Z * 900, c.height / 2 + Y / Z * 900]; 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; async function loadOBJ(url, scale, tx, ty, tz, rl, pt, yw) { let res; await fetch(url, res => res).then(data => data.text()).then(data => { a = []; data.split("\nv ").map(v => { a = [...a, v.split("\n")[0]]; }); a = a.filter((v, i) => i).map(v => [...v.split(' ').map(n => +n.replace("\n", ''))]); ax = ay = az = 0; a.map(v => { v[1] *= -1; ax += v[0]; ay += v[1]; az += v[2]; }); ax /= a.length; ay /= a.length; az /= a.length; a.map(v => { X = (v[0] - ax) * scale; Y = (v[1] - ay) * scale; Z = (v[2] - az) * scale; R2(rl, pt, yw, 0); v[0] = X; v[1] = Y; v[2] = Z; }); maxY = -6e6; a.map(v => { if (v[1] > maxY) maxY = v[1]; }); a.map(v => { v[1] -= maxY - oY; v[0] += tx; v[1] += ty; v[2] += tz; }); b = []; data.split("\nf ").map(v => { b = [...b, v.split("\n")[0]]; }); b.shift(); b = b.map(v => v.split(' ')); b = b.map(v => { v = v.map(q => { return +q.split('/')[0]; }); v = v.filter(q => q); return v; }); res = []; b.map(v => { e = []; v.map(q => { e = [...e, a[q - 1]]; }); e = e.filter(q => q); res = [...res, e]; }); }); return res; } 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 = 150; 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) * 1e3 / d; Y += (Y - Y2) * 1e3 / d; Z += (Z - Z2) * 1e3 / 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; } }); } mind = 6e6; B.map((v, i).........完整代码请登录后点击上方下载按钮下载查看
网友评论0