canvas宇宙网连接动画效果
代码语言:html
所属分类:动画
代码描述:canvas宇宙网连接动画效果
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> html, body { margin: 0; } body { overflow: hidden; } canvas { position: absolute; } </style> </head> <body translate="no"> <canvas id="canvas-bottom"></canvas> <canvas id="canvas-top"></canvas> <script > // Provides a simple 3D vector class. Vector operations can be done using member functions, which return new vectors, or static functions, which reuse existing vectors to avoid generating garbage. // original code by https://evanw.github.io/lightgl.js/docs/vector.html (function() { function Vector(x, y, z) { this.x = x || 0; this.y = y || 0; this.z = z || 0; } Vector.prototype = { negative: function() { return new Vector(-this.x, -this.y, -this.z); }, add: function(v) { if (v instanceof Vector) return new Vector(this.x + v.x, this.y + v.y, this.z + v.z); else return new Vector(this.x + v, this.y + v, this.z + v); }, subtract: function(v) { if (v instanceof Vector) return new Vector(this.x - v.x, this.y - v.y, this.z - v.z); else return new Vector(this.x - v, this.y - v, this.z - v); }, multiply: function(v) { if (v instanceof Vector) return new Vector(this.x * v.x, this.y * v.y, this.z * v.z); else return new Vector(this.x * v, this.y * v, this.z * v); }, divide: function(v) { if (v instanceof Vector) return new Vector(this.x / v.x, this.y / v.y, this.z / v.z); else return new Vector(this.x / v, this.y / v, this.z / v); }, equals: function(v) { return this.x == v.x && this.y == v.y && this.z == v.z; }, dot: function(v) { return this.x * v.x + this.y * v.y + this.z * v.z; }, cross: function(v) { return new Vector( this.y * v.z - this.z * v.y, this.z * v.x - this.x * v.z, this.x * v.y - this.y * v.x ); }, length: function() { return Math.sqrt(this.dot(this)); }, unit: function() { return this.divide(this.length()); }, min: function() { return Math.min(Math.min(this.x, this.y), this.z); }, max: function() { return Math.max(Math.max(this.x, this.y), this.z); }, toAngles: function() { return { theta: Math.atan2(this.z, this.x), phi: Math.asin(this.y / this.length()) }; }, angleTo: function(a) { return Math.acos(this.dot(a) / (this.length() * a.length())); }, toArray: function(n) { return [this.x, this.y, this.z].slice(0, n || 3); }, clone: function() { return new Vector(this.x, this.y, this.z); }, init: function(x, y, z) { this.x = x; this.y = y; this.z = z; return this; }, noZ: function() { this.z = 0; return this; } }; Vector.negative = function(a, b) { b.x = -a.x; b.y = -a.y; b.z = -a.z; return b; }; Vector.add = function(a, b, c) { if (b instanceof Vector) { c.x = a.x + b.x; c.y = a.y + b.y; c.z = a.z + b.z; } else { c.x = a.x + b; c.y = a.y + b; c.z = a.z + b; } return c; }; Vector.subtract = function(a, b, c) { if (b instanceof Vector) { c.x = a.x - b.x; c.y = a.y - b.y; c.z = a.z - b.z; } else { c.x = a.x - b; c.y = a.y - b; c.z = a.z - b; } return c; }; Vector.multiply = function(a, b, c) { if (b instanceof Vector) { c.x = a.x * b.x; c.y = a.y * b.y; c.z = a.z * b.z; } else { c.x = a.x * b; c.y = a.y * b; c.z = a.z * b; } return c; }; Vector.divide = function(a, b, c) { if (b instanceof Vector) { c.x = a.x / b.x; c.y = a.y / b.y; c.z = a.z / b.z; } else { c.x = a.x / b; c.y = a.y / b; c.z = a.z / b; } return c; }; Vector.cross = function(a, b, c) { c.x = a.y * b.z - a.z * b.y; c.y = a.z * b.x - a.x * b.z; c.z = a.x * b.y - a.y * b.x; return c; }; Vector.unit = function(a, b) { var length = a.length(); b.x = a.x / length; b.y = a.y / length; b.z = a.z / length; return b; }; Vector.fromAngles = function(theta, phi) { return new Vector(Math.cos(theta) * Math.cos(phi), Math.sin(phi), Math.sin(theta) * Math.cos(phi)); }; Vector.randomDirection = function() { return Vector.fromAngles(Math.random() * Math.PI * 2, Math.asin(Math.random() * 2 - 1)); }; Vector.min = function(a, b) { return new Vector(Math.min(a.x, b.x), Math.min(a.y, b.y), Math.min(a.z, b.z)); }; Vector.max = function(a, b) { return new Vector(Math.max(a.x, b.x), Math.max(a.y, b.y), Math.max(a.z, b.z)); }; Vector.lerp = function(a, b, fraction) { return b.subtract(a).multiply(fraction).add(a); }; Vector.fromArray = function(a) { return new Vector(a[0], a[1], a[2]); }; Vector.angleBetween = function(a, b) { return a.angleTo(b); }; window.Vector = Vector; })(); (function () { 'use strict'; // Configuration options var opts = { background: 'black', numberOrbs: 100, // increase with screen size. 50 to 100 for my 2560 x 1400 monitor maxVelocity: 2.5, // increase with screen size--dramatically affects line density. 2-3 for me orbRadius: 1, // keep small unless you really want to see the dots bouncing. I like <= 1. minProximity: 100, // controls how close dots have to come to each other before lines are traced initialColorAngle: 7, // initialize the color angle, default = 7 colorFrequency: 0.3, // 0.3 default colorAngleIncrement: 0.009, // 0.009 is slow and even globalAlpha: 0.010, //controls alpha for lines, but not dots (despite the name) manualWidth: false, // Default: false, change to your own custom width to override width = window.innerWidth. Yes i know I'm mixing types here, sue me. manualHeight: false // Default: false, change to your own custom height to override height = window.innerHeight }; // Canvas globals var canvasTop, linecxt, canvasBottom, cxt, width, height, animationFrame; // Global objects var orbs; // Orb object - these are the guys that bounce around the screen. // We will draw lines between these dots, but that behavior is found // in the Orbs container object var Orb = function () { // Constructor function Orb(radius, color) { var posX = randBetween(0, width); var posY = randBetween(0, height); this.position = new Vector(posX, posY); var velS = randBetween(0, opts.maxVelocity); // Velocity scalar this.v.........完整代码请登录后点击上方下载按钮下载查看
网友评论0