canvas蓝色线条流动湍流世界动画效果代码
代码语言:html
所属分类:动画
代码描述:canvas蓝色线条流动湍流世界动画效果代码
代码标签: canvas 蓝色 线条 流动 湍流 世界 动画
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> </head> <body> <script > let App = {} App.setup = function () { // The setup function initializes everything in a permanent way (will never be set anew) const canvas = document.createElement('canvas') //const maxWidth = 9933, maxHeight = 14043 //const quality = 0.1 //this.filename = "artwork" this.canvas = canvas this.canvas.width = window.innerWidth//maxWidth * quality//window.innerWidth this.canvas.height = window.innerHeight//maxHeight * quality//3370//window.innerHeight this.ctx = this.canvas.getContext('2d') this.width = this.canvas.width this.height = this.canvas.height this.dataToImageRatio = Math.max(this.width, this.height) / 1000 // Blend mode /!\ Don't use if you can! Can be a mega source of lag, proportional to canvas size this.ctx.globalCompositeOperation = 'darker'// This one is OK //this.ctx.globalCompositeOperation = 'lighter'// This one is OK this.ctx.imageSmoothingEnabled = false this.ctx.webkitImageSmoothingEnabled = false this.ctx.msImageSmoothingEnabled = false this.xC = this.width / 2 this.yC = this.height / 2 document.getElementsByTagName('body')[0].appendChild(canvas) // Particle system properties this.lifespan = 300 this.popPerBirth = 5 this.maxPop = 1500 this.birthFreq = 1 } App.start = function () { // The start function sets, and potentially resets things that will change over time this.stepCount = 0 this.particles = [] // Counters for UI this.drawnInLastFrame = 0 this.deathCount = 0 // Initial paint (background most often) this.initDraw() } App.evolve = function () { let time1 = performance.now() this.stepCount++ // Use birth control if (this.stepCount % this.birthFreq == 0 && (this.particles.length + this.popPerBirth) < this.maxPop) { for (let n = 0; n < this.popPerBirth; n++) { this.birth() } } // Core sequence: MOVE everything then DRAW everything App.move() App.draw() let time2 = performance.now() } App.birth = function () { let x = -800 + 1600 * Math.random(), y = -800 + 1600 * Math.random() let particle = { hue: 195 + 3 * Math.floor(3 * Math.random()), sat: 65 + 30 * Math.random(), lum: 15 + Math.floor(50*Math.random()), x, y, xLast: x, yLast: y, xSpeed: 0, ySpeed: 0, age: 0, name: 'seed-' + Math.ceil(10000000 * Math.random()) } this.particles.push(particle) } App.kill = function (deadParticleName) { this.particles = this.particles.filter(p => p.name !== deadParticleName) } App.move = function () { for (let i = 0; i < this.particles.length; i++) { // Get particle let p = this.particles[i] // Save last position p.xLast = p.x p.yLast = p.y // Reset velocity, as we're dealing with velocity fields and not forces p.xSpeed = 0; p.ySpeed = 0 // Eddies, boys let eddies = [], baseK = 7 eddies.push({ x: -300, y: -300, K: 10 * baseK, r0: 180 }) eddies.push({ x: 300, y: -300, K: 15 * baseK, r0: 150 }) eddies.push({ x: 300, y: 300, K: 10 * baseK, r0: 250 }) eddies.push({ x: -300, y: 300, K: 15 * baseK, r0: 150 }) eddies.push({ x: 0, y: 0, K: 5 * baseK, r0: 20 }) for (var e = 0; e < eddies.length; e++) { let eddy = eddies[e] let dx = p.x - eddy.x, dy = p.y - eddy.y, r = Math.sqrt(dx*dx + dy*dy), theta = Utils.segmentAngleRad(0, 0, dx, dy, true), cos = Math.cos(theta), sin = Math.sin(theta), K = eddy.K, // intensity r0 = edd.........完整代码请登录后点击上方下载按钮下载查看
网友评论0