JS 3D立方体自动旋转
肥学 人气:0演示
技术栈
display:inline-block,block,inline元素的区别:
display:block将元素显示为块级元素,从而可以更好地操控元素的宽高,以及内外边距,每一个块级元素都是从新的一行开始。
display : inline将元素显示为行内元素,高度,行高以及底边距不可改变,高度就是内容文字或者图片的宽度,不可以改变。多个相邻的行内元素排在同一行里,知道页面一行排列不下,才会换新的一行。
display:inline-block看上去值名inline-block是一个混合产物,实际上确是如此,将元素显示为行内块状元素,设置该属性后,其他的行内块级元素会排列在同一行。比如我们li元素一个inline-block,使其既有block的宽度高度特性,又有inline的同行特性,在同一行内有不同高度内容的元素时,通常要设置对齐方式如vertical-align:top;来使元素顶部对齐。
行内标签:不能设置宽度 高度 padding margin,标签不能自动伸展。可以通过display灵活的将标签在行内和行间随意转换;display:inline;转换成行内标签display:block;转换成块级标签。
opacity 属性设置或返回元素的不透明度。
元素的不透明度级别描述了透明度级别,当不透明度为 1 时表示完全不透明,当不透明度为 0.5 时表示半透明,当不透明度为 0 时表示完全透明。
源码
css
* { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; overflow: hidden; } canvas { display: block; position: absolute; z-index: -2; } .snowback{ height: 100%; width: 100%; overflow: hidden; position: absolute; z-index: 1; } .ziti{ height: 50px; width: 100%; font-size: 60px; text-align: center; position: absolute; margin-top: 100px; z-index: 11; } .ziti span { height: 30px; width: 100%; font-size: 25px; font-family: "微软雅黑"; text-align: center; line-height: 30px; /*关键代ç */ background-image: -webkit-linear-gradient(left, rgb(20, 26, 150), #E6D205 25%, rgb(196, 30, 30) 50%, rgb(41, 197, 111) 75%, rgb(175, 23, 221)); -webkit-text-fill-color: transparent; -webkit-background-clip: text; -webkit-background-size: 200% 100%; animation: masked-animation 4s infinite linear; } /*关键代ç */ @keyframes masked-animation { 0% { background-position: 0 0; } 100% { background-position: -100% 0; } } .main{ width: 200px; height: 200px; top:calc(calc(50% - 100px)); margin-left: calc(50% - 100px); position: absolute; } .box { width: 200px; height: 200px; opacity: 1; position: absolute; transform: scale(0.8); } .box-biger:hover+.box{ transform: scale(0.8); } .box-biger{ width: 200px; height: 200px; opacity: 0; transition: all 1s; position: absolute; z-index: 10; } .box-biger:hover{ width: 600px; height: 600px; opacity: 1; margin-top: calc(50% - 300px); margin-left: calc(50% - 300px); } .box ul { width: 100%; height: 100%; transform-style: preserve-3d; background-color: transparent; list-style: none; position: absolute; transition: all 1s; transform-origin: 50% 50% 0; } .box-biger ul{ width: 100%; height: 100%; transform-style: preserve-3d; background-color: transparent; list-style: none; position: absolute; transition: all 1s; } .small { font-size: 60px; text-align: center; display: inline-block; width: 100%; height: 100%; position: absolute; box-sizing: border-box; } .biger { font-size: 60px; text-align: center; display: inline-block; width: 100%; height: 100%; position: absolute; box-sizing: border-box; } .small img{ height: 100%; width: 100%; opacity: 1; } .biger img{ height: 70%; width: 70%; margin-top: 15%; margin-left: 15%; opacity: 0.3; } .idv1 { background-size: cover; left: 0; top: 100%; transform: translateZ(-100px) rotateY(180deg) rotate(180deg); transform-origin: top; } .idv2 { background-size: cover; top: 0; margin-left: 50%; transform: rotateY(90deg); } .idv3 { background-size: cover; left: 0; top: 0; margin-left: -50%; transform: rotateY(90deg); } .idv4 { transform: rotateX(90deg); top: -50%; } .idv5 { transform: rotateX(270deg); top: 50%; } .idv6 { background-size: cover; left: 0; top: 0; transform: translateZ(100px); } .idv7 { background-size: cover; left: 0; top: 100%; transform: translateZ(-100px) rotateY(180deg) rotate(180deg); transform-origin: top; transition: all 1s; } .idv12 { background-size: cover; left: 0; top: 0; transform: translateZ(100px); transition: all 1s; } .box-biger:hover>ul>.idv7{ transform: translateZ(-300px) rotateY(180deg) rotate(180deg); } .box-biger:hover>ul>.idv12{ transform: translateZ(300px); } .btn { height: 60px; text-align: center; line-height: 60px; width: 90px; margin-left: 20px; float: left; box-sizing: border-box; position: absolute; border-radius: 30px; z-index: 30; }
js
// Customize these... var n = 300, speed = 5,//速度定义 startSize = rand(100,300);//大小定义 // ...not these var c = document.getElementById("c"), ctx = c.getContext("2d"), cw = (c.width = window.innerWidth), ch = (c.height = window.innerHeight), mousePos = {x:"", y:""}, img = new Image(), particles = [], particleNumber = 0, Particle = function(index) { this.index = index; this.dur = (100-rand(9, 90))/speed; this.draw = function() { ctx.translate( this.x, this.y ); ctx.globalAlpha = this.alpha; ctx.globalCompositeOperation = 'lighter'; // if (index%1.5==0) ctx.globalCompositeOperation = 'overlay'; if (index%2==0) ctx.globalCompositeOperation = 'xor'; ctx.drawImage(img, -this.size/2, -this.size/2, this.size, this.size); ctx.translate( -this.x, -this.y ); } }; function setParticle(p, firstRun) { var _x = cw*rand(0,1), _y = ch*rand(0,1), _s = startSize; if (rand(0,1)>0.3 && mousePos.x!=""){ //console.log(mousePos) _x = mousePos.x; _y = mousePos.y; _s = _s/10; } var _tl = new TimelineMax() .fromTo(p, p.dur, { x:_x, y:_y, size:_s, alpha:0 },{ size:'+='+String(rand(200,400)), bezier:[{alpha:rand(0.15,0.65)},{alpha:0}], ease:Power1.easeOut,//ease:Power0.easeNone, onComplete:function(){ setParticle(p); } }); if (firstRun) _tl.seek(p.dur*rand()); //fast-forward on first run } TweenMax.ticker.addEventListener("tick", function(){ ctx.clearRect(0, 0, cw, ch); for (var i=0; i<n; i++) particles[i].draw(); }); window.addEventListener('resize', doResize) function doResize() { particleNumber = 0; cw = (c.width = window.innerWidth); ch = (c.height = window.innerHeight); for (var i=0; i<n; i++) { TweenMax.killTweensOf(particles[i]); setParticle(particles[i], true); } TweenMax.fromTo(c, 0.3, {alpha:0},{alpha:1, ease:Power3.easeInOut}); } // First run for (var i=0; i<n; i++) particles.push(new Particle(i)); doResize(); function rand(min, max) { (min) ? min=min : min=0; (max) ? max=max : max=1; return min + (max-min)*Math.random(); }
雪花部分
//使用时去掉if语句即可 var THREE = THREE || {}; if (!self.Int32Array) self.Int32Array = Array, self.Float32Array = Array; THREE.Color = function(a) { a !== void 0 && this.setHex(a); return this }; THREE.Color.prototype = { constructor: THREE.Color, r: 1, g: 1, b: 1, copy: function(a) { this.r = a.r; this.g = a.g; this.b = a.b; return this }, copyGammaToLinear: function(a) { this.r = a.r * a.r; this.g = a.g * a.g; this.b = a.b * a.b; return this }, copyLinearToGamma: function(a) { this.r = Math.sqrt(a.r); this.g = Math.sqrt(a.g); this.b = Math.sqrt(a.b); return this }, setRGB: function(a, b, c) { this.r = a; this.g = b; this.b = c; return this }, setHSV: function(a, b, c) { var d, f, e; if (c === 0) this.r = this.g = this.b = 0; else switch (d = Math.floor(a * 6), f = a * 6 - d, a = c * (1 - b), e = c * (1 - b * f), b = c * (1 - b * (1 - f)), d) { case 1: this.r = e; this.g = c; this.b = a; break; case 2: this.r = a; this.g = c; this.b = b; break; case 3: this.r = a; this.g = e; this.b = c; break; case 4: this.r = b; this.g = a; this.b = c; break; case 5: this.r = c; this.g = a; this.b = e; break; case 6: case 0: this.r = c, this.g = b, this.b = a } return this }, setHex: function(a) { a = Math.floor(a); this.r = (a >> 16 & 255) / 255; this.g = (a >> 8 & 255) / 255; this.b = (a & 255) / 255; return this }, getHex: function() { return ~~(this.r * 255) << 16 ^ ~~(this.g * 255) << 8 ^ ~~(this.b * 255) }, getContextStyle: function() { return "rgb(" + Math.floor(this.r * 255) + "," + Math.floor(this.g * 255) + "," + Math.floor(this.b * 255) + ")" }, clone: function() { return (new THREE.Color).setRGB(this.r, this.g, this.b) } }; THREE.Vector2 = function(a, b) { this.x = a || 0; this.y = b || 0 }; THREE.Vector2.prototype = { constructor: THREE.Vector2, set: function(a, b) { this.x = a; this.y = b; return this }, subSelf: function(a) { this.x -= a.x; this.y -= a.y; return this }, multiplyScalar: function(a) { this.x *= a; this.y *= a; return this }, divideScalar: function(a) { a ? (this.x /= a, this.y /= a) : this.set(0, 0); return this }, negate: function() { return this.multiplyScalar(-1) }, dot: function(a) { return this.x * a.x + this.y * a.y }, lengthSq: function() { return this.x * this.x + this.y * this.y }, length: function() { return Math.sqrt(this.lengthSq()) }, normalize: function() { return this.divideScalar(this.length()) }, distanceTo: function(a) { return Math.sqrt(this.distanceToSquared(a)) }, distanceToSquared: function(a) { var b = this.x - a.x, a = this.y - a.y; return b * b + a * a }, setLength: function(a) { return this.normalize().multiplyScalar(a) }, equals: function(a) { return a.x === this.x && a.y === this.y } }; THREE.Vector3 = function(a, b, c) { this.x = a || 0; this.y = b || 0; this.z = c || 0 }; THREE.Vector3.prototype = { constructor: THREE.Vector3, set: function(a, b, c) { this.x = a; this.y = b; this.z = c; return this }, setX: function(a) { this.x = a; return this }, setY: function(a) { this.y = a; return this }, setZ: function(a) { this.z = a; return this }, copy: function(a) { this.x = a.x; this.y = a.y; this.z = a.z; return this }, clone: function() { return new THREE.Vector3(this.x, this.y, this.z) }, divideScalar: function(a) { a ? (this.x /= a, this.y /= a, this.z /= a) : this.z = this.y = this.x = 0; return this }, negate: function() { return this.multiplyScalar(-1) }, dot: function(a) { return this.x * a.x + this.y * a.y + this.z * a.z }, lengthSq: function() { return this.x * this.x + this.y * this.y + this.z * this.z }, length: function() { return Math.sqrt(this.lengthSq()) }, lengthManhattan: function() { return this.x + this.y + this.z }, normalize: function() { return this.divideScalar(this.length()) }, setLength: function(a) { return this.normalize().multiplyScalar(a) }, THREE.Vector4.prototype = { constructor: THREE.Vector4, set: function(a, b, c, d) { this.x = a; this.y = b; this.z = c; this.w = d; return this }, divideScalar: function(a) { a ? (this.x /= a, this.y /= a, this.z /= a, this.w /= a) : (this.z = this.y = this.x = 0, this.w = 1); return this }, negate: function() { return this.multiplyScalar(-1) }, dot: function(a) { return this.x * a.x + this.y * a.y + this.z * a.z + this.w * a.w }, lengthSq: function() { return this.dot(this) }, length: function() { return Math.sqrt(this.lengthSq()) }, normalize: function() { return this.divideScalar(this.length()) }, setLength: function(a) { return this.normalize().multiplyScalar(a) }, lerpSelf: function(a, b) { this.x += (a.x - this.x) * b; this.y += (a.y - this.y) * b; this.z += (a.z - this.z) * b; this.w += (a.w - this.w) * b; return this } }; THREE.Ray = function(a, b) { function c(a, b, c) { i.sub(c, a); p = i.dot(b); if (p <= 0) return null; k = n.add(a, o.copy(b).multiplyScalar(p)); return s = c.distanceTo(k) } this.addPoint = function(e, g) { h ? (h = !1, b = e, c = g, d = e, f = g) : (b = b < e ? b : e, c = c < g ? c : g, d = d > e ? d : e, f = f > g ? f : g); a() }; this.add3Points = function(e, g, j, i, n, o) { h ? (h = !1, b = e < j ? e < n ? e : n : j < n ? j : n, c = g < i ? g < o ? g : o : i < o ? i : o, d = e > j ? e > n ? e : n : j > n ? j : n, f = g > i ? g > o ? g : o : i > o ? i : o) : (b = e < j ? e < n ? e < b ? e : b : n < b ? n : b : j < n ? j < b ? j : b : n < b ? n : b, c = g < i ? g < o ? g < c ? g : c : o < c ? o : c : i < o ? i < c ? i : c : o < c ? o : c, d = e > j ? e > n ? e > d ? e : d : n > d ? n : d : j > n ? j > d ? j : d : n > d ? n : d, f = g > i ? g > o ? g > f ? g : f : o > f ? o : f : i > o ? i > f ? i : f : o > f ? o : f); a() }; this.addRectangle = function(e) { h ? (h = !1, b = e.getLeft(), c = e.getTop(), d = e.getRight(), f = e.getBottom()) : (b = b < e.getLeft() ? b : e.getLeft(), c = c < e.getTop() ? c : e.getTop(), d = d > e.getRight() ? d : e.getRight(), f = f > e.getBottom() ? f : e.getBottom()); a() }; this.inflate = function(e) { b -= e; c -= e; d += e; f += e; a() }; this.minSelf = function(e) { b = b > e.getLeft() ? b : e.getLeft(); c = c > e.getTop() ? c : e.getTop(); d = d < e.getRight() ? d : e.getRight(); f = f < e.getBottom() ? f : e.getBottom(); a() }; this.intersects = function(a) { return Math.min(d, a.getRight()) - Math.max(b, a.getLeft()) >= 0 && Math.min(f, a.getBottom()) - Math.max(c, a.getTop()) >= 0 }; this.empty = function() { h = !0; f = d = c = b = 0; a() }; this.isEmpty = function() { return h } }; THREE.Math = { clamp: function(a, b, c) { return a < b ? b : a > c ? c : a }, clampBottom: function(a, b) { return a < b ? b : a }, mapLinear: function(a, b, c, d, f) { return d + (a - b) * (f - d) / (c - b) }, random16: function() { return (65280 * Math.random() + 255 * Math.random()) / 65535 } }; THREE.Matrix3 = function() { this.m = [] }; THREE.Matrix3.prototype = { constructor: THREE.Matrix3, transpose: function() { var a, b = this.m; a = b[1]; b[1] = b[3]; b[3] = a; a = b[2]; b[2] = b[6]; b[6] = a; a = b[5]; b[5] = b[7]; b[7] = a; return this }, transposeIntoArray: function(a) { var b = this.m; a[0] = b[0]; a[1] = b[3]; a[2] = b[6]; a[3] = b[1]; a[4] = b[4]; a[5] = b[7]; a[6] = b[2]; a[7] = b[5]; a[8] = b[8]; return this } }; THREE.Matrix4 = function(a, b, c, d, f, e, g, h, m, l, j, i, n, o, p, k) { this.set(a !== void 0 ? a : 1, b || 0, c || 0, d || 0, f || 0, e !== void 0 ? e : 1, g || 0, h || 0, m || 0, l || 0, j !== void 0 ? j : 1, i || 0, n || 0, o || 0, p || 0, k !== void 0 ? k : 1); this.flat = Array(16); this.m33 = new THREE.Matrix3 }; THREE.Matrix4.prototype = { constructor: THREE.Matrix4, set: function(a, b, c, d, f, e, g, h, m, l, j, i, n, o, p, k) { this.n11 = a; this.n12 = b; this.n13 = c; this.n14 = d; this.n21 = f; this.n22 = e; this.n23 = g; this.n24 = h; this.n31 = m; this.n32 = l; this.n33 = j; this.n34 = i; this.n41 = n; this.n42 = o; this.n43 = p; this.n44 = k; return this }, identity: function() { this.set(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); return this }, copy: function(a) { this.set(a.n11, a.n12, a.n13, a.n14, a.n21, a.n22, a.n23, a.n24, a.n31, a.n32, a.n33, a.n34, a.n41, a.n42, a.n43, a.n44); return this }, lookAt: function(a, b, c) { var d = THREE.Matrix4.__v1, f = THREE.Matrix4.__v2, e = THREE.Matrix4.__v3; e.sub(a, b).normalize(); if (e.length() === 0) e.z = 1; d.cross(c, e).normalize(); d.length() === 0 && (e.x += 1.0E-4, d.cross(c, e).normalize()); f.cross(e, d).normalize(); this.n11 = d.x; this.n12 = f.x; this.n13 = e.x; this.n21 = d.y; this.n22 = f.y; this.n23 = e.y; this.n31 = d.z; this.n32 = f.z; this.n33 = e.z; return this }, multiply: function(a, b) { var c = a.n11, d = a.n12, f = a.n13, e = a.n14, g = a.n21, h = a.n22, m = a.n23, l = a.n24, j = a.n31, i = a.n32, n = a.n33, o = a.n34, p = a.n41, k = a.n42, s = a.n43, K = a.n44, C = b.n11, Q = b.n12, O = b.n13, w = b.n14, F = b.n21, z = b.n22, D = b.n23, u = b.n24, r = b.n31, E = b.n32, N = b.n33, W = b.n34, da = b.n41, G = b.n42, H = b.n43, I = b.n44; this.n11 = c * C + d * F + f * r + e * da; this.n12 = c * Q + d * z + f * E + e * G; this.n13 = c * O + d * D + f * N + e * H; this.n14 = c * w + d * u + f * W + e * I; this.n21 = g * C + h * F + m * r + l * da; this.n22 = g * Q + h * z + m * E + l * G; this.n23 = g * O + h * D + m * N + l * H; this.n24 = g * w + h * u + m * W + l * I; this.n31 = j * C + i * F + n * r + o * da; this.n32 = j * Q + i * z + n * E + o * G; this.n33 = j * O + i * D + n * N + o * H; this.n34 = j * w + i * u + n * W + o * I; this.n41 = p * C + k * F + s * r + K * da; this.n42 = p * Q + k * z + s * E + K * G; this.n43 = p * O + k * D + s * N + K * H; this.n44 = p * w + k * u + s * W + K * I; return this }, multiplySelf: function(a) { return this.multiply(this, a) }, multiplyToArray: function(a, b, c) { this.multiply(a, b); c[0] = this.n11; c[1] = this.n21; c[2] = this.n31; c[3] = this.n41; c[4] = this.n12; c[5] = this.n22; c[6] = this.n32; c[7] = this.n42; c[8] = this.n13; c[9] = this.n23; c[10] = this.n33; c[11] = this.n43; c[12] = this.n14; c[13] = this.n24; c[14] = this.n34; c[15] = this.n44; return this }, multiplyScalar: function(a) { this.n11 *= a; this.n12 *= a; this.n13 *= a; this.n14 *= a; this.n21 *= a; this.n22 *= a; this.n23 *= a; this.n24 *= a; this.n31 *= a; this.n32 *= a; this.n33 *= a; this.n34 *= a; this.n41 *= a; this.n42 *= a; this.n43 *= a; this.n44 *= a; return this }, multiplyVector3: function(a) { var b = a.x, c = a.y, d = a.z, f = 1 / (this.n41 * b + this.n42 * c + this.n43 * d + this.n44); a.x = (this.n11 * b + this.n12 * c + this.n13 * d + this.n14) * f; a.y = (this.n21 * b + this.n22 * c + this.n23 * d + this.n24) * f; a.z = (this.n31 * b + this.n32 * c + this.n33 * d + this.n34) * f; return a }, multiplyVector4: function(a) { var b = a.x, c = a.y, d = a.z, f = a.w; a.x = this.n11 * b + this.n12 * c + this.n13 * d + this.n14 * f; a.y = this.n21 * b + this.n22 * c + this.n23 * d + this.n24 * f; a.z = this.n31 * b + this.n32 * c + this.n33 * d + this.n34 * f; a.w = this.n41 * b + this.n42 * c + this.n43 * d + this.n44 * f; return a }, rotateAxis: function(a) { var b = a.x, c = a.y, d = a.z; a.x = b * this.n11 + c * this.n12 + d * this.n13; a.y = b * this.n21 + c * this.n22 + d * this.n23; a.z = b * this.n31 + c * this.n32 + d * this.n33; a.normalize(); return a }, crossVector: function(a) { var b = new THREE.Vector4; b.x = this.n11 * a.x + this.n12 * a.y + this.n13 * a.z + this.n14 * a.w; b.y = this.n21 * a.x + this.n22 * a.y + this.n23 * a.z + this.n24 * a.w; b.z = this.n31 * a.x + this.n32 * a.y + this.n33 * a.z + this.n34 * a.w; b.w = a.w ? this.n41 * a.x + this.n42 * a.y + this.n43 * a.z + this.n44 * a.w : 1; return b }, multiplySelf: function(a) { var b = this.x, c = this.y, d = this.z, f = this.w, e = a.x, g = a.y, h = a.z, a = a.w; this.x = b * a + f * e + c * h - d * g; this.y = c * a + f * g + d * e - b * h; this.z = d * a + f * h + b * g - c * e; this.w = f * a - b * e - c * g - d * h; return this }, multiply: function(a, b) { this.x = a.x * b.w + a.y * b.z - a.z * b.y + a.w * b.x; this.y = -a.x * b.z + a.y * b.w + a.z * b.x + a.w * b.y; this.z = a.x * b.y - a.y * b.x + a.z * b.w + a.w * b.z; this.w = -a.x * b.x - a.y * b.y - a.z * b.z + a.w * b.w; return this }, multiplyVector3: function(a, b) { b || (b = a); var c = a.x, d = a.y, f = a.z, e = this.x, g = this.y, h = this.z, m = this.w, l = m * c + g * f - h * d, j = m * d + h * c - e * f, i = m * f + e * d - g * c, c = -e * c - g * d - h * f; b.x = l * m + c * -e + j * -h - i * -g; b.y = j * m + c * -g + i * -e - l * -h; b.z = i * m + c * -h + l * -g - j * -e; return b } }; THREE.Quaternion.slerp = function(a, b, c, d) { var f = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; f < 0 ? (c.w = -b.w, c.x = -b.x, c.y = -b.y, c.z = -b.z, f = -f) : c.copy(b); if (Math.abs(f) >= 1) return c.w = a.w, c.x = a.x, c.y = a.y, c.z = a.z, c; var e = Math.acos(f), f = Math.sqrt(1 - f * f); if (Math.abs(f) < 0.001) return c.w = 0.5 * (a.w + b.w), c.x = 0.5 * (a.x + b.x), c.y = 0.5 * (a.y + b.y), c.z = 0.5 * (a.z + b.z), c; b = Math.sin((1 - d) * e) / f; d = Math.sin(d * e) / f; c.w = a.w * b + c.w * d; c.x = a.x * b + c.x * d; c.y = a.y * b + c.y * d; c.z = a.z * b + c.z * d; return c }; THREE.Vertex = function(a) { this.position = a || new THREE.Vector3 }; THREE.Face3 = function(a, b, c, d, f, e) { this.a = a; this.b = b; this.c = c; this.normal = d instanceof THREE.Vector3 ? d : new THREE.Vector3; this.vertexNormals = d instanceof Array ? d : []; this.color = f instanceof THREE.Color ? f : new THREE.Color; this.vertexColors = f instanceof Array ? f : []; this.vertexTangents = []; this.materialIndex = e; this.centroid = new THREE.Vector3 }; THREE.Face4 = function(a, b, c, d, f, e, g) { this.a = a; this.b = b; this.c = c; this.d = d; this.normal = f instanceof THREE.Vector3 ? f : new THREE.Vector3; this.vertexNormals = f instanceof Array ? f : []; this.color = e instanceof THREE.Color ? e : new THREE.Color; this.vertexColors = e instanceof Array ? e : []; this.vertexTangents = []; this.materialIndex = g; this.centroid = new THREE.Vector3 }; THREE.UV = function(a, b) { this.u = a || 0; this.v = b || 0 }; THREE.UV.prototype = { constructor: THREE.UV, set: function(a, b) { this.u = a; this.v = b; return this }, copy: function(a) { this.u = a.u; this.v = a.v; return this }, clone: function() { return new THREE.UV(this.u, this.v) } }; function wa(a, b, c, d) { var e = ~~(a.r * 255), f = ~~(a.g * 255), a = ~~(a.b * 255), g = ~~(b.r * 255), h = ~~(b.g * 255), b = ~~(b.b * 255), i = ~~(c.r * 255), j = ~~(c.g * 255), c = ~~(c.b * 255), k = ~~(d.r * 255), l = ~~(d.g * 255), d = ~~(d.b * 255); ba[0] = e < 0 ? 0 : e > 255 ? 255 : e; ba[1] = f < 0 ? 0 : f > 255 ? 255 : f; ba[2] = a < 0 ? 0 : a > 255 ? 255 : a; ba[4] = g < 0 ? 0 : g > 255 ? 255 : g; ba[5] = h < 0 ? 0 : h > 255 ? 255 : h; ba[6] = b < 0 ? 0 : b > 255 ? 255 : b; ba[8] = i < 0 ? 0 : i > 255 ? 255 : i; ba[9] = j < 0 ? 0 : j > 255 ? 255 : j; ba[10] = c < 0 ? 0 : c > 255 ? 255 : c; ba[12] = k < 0 ? 0 : k > 255 ? 255 : k; ba[13] = l < 0 ? 0 : l > 255 ? 255 : l; ba[14] = d < 0 ? 0 : d > 255 ? 255 : d; ra.putImageData(za, 0, 0); va.drawImage(qa, 0, 0); return sa } function na(a, b, c) { a = (a - b) / (c - b); return a * a * (3 - 2 * a) } function pa(a) { a = (a + 1) * 0.5; return a < 0 ? 0 : a > 1 ? 1 : a } function ka(a, b) { var c = b.x - a.x, d = b.y - a.y, e = c * c + d * d; e != 0 && (e = 1 / Math.sqrt(e), c *= e, d *= e, b.x += c, b.y += d, a.x -= c, a.y -= d) } var xa, Ha, U, ca; this.autoClear ? this.clear() : k.setTransform(1, 0, 0, -1, o, p); e.info.render.vertices = 0; e.info.render.faces = 0; g = l.projectScene(a, j, this.sortElements); h = g.elements; m = g.lights; (ya = m.length > 0) && i(m); xa = 0; for (Ha = h.length; xa < Ha; xa++) if (U = h[xa], ca = U.material, ca = ca instanceof THREE.MeshFaceMaterial ? U.faceMaterial : ca, !(ca == null || ca.opacity == 0)) { X.empty(); if (U instanceof THREE.RenderableParticle) u = U, u.x *= o, u.y *= p, s(u, U, ca, a); else if (U instanceof THREE.RenderableLine) u = U.v1, r = U.v2, u.positionScreen.x *= o, u.positionScreen.y *= p, r.positionScreen.x *= o, r.positionScreen.y *= p, X.addPoint(u.positionScreen.x, u.positionScreen.y), X.addPoint(r.positionScreen.x, r.positionScreen.y), ma.intersects(X) && w(u, r, U, ca, a); else if (U instanceof THREE.RenderableFace3) u = U.v1, r = U.v2, E = U.v3, u.positionScreen.x *= o, u.positionScreen.y *= p, r.positionScreen.x *= o, r.positionScreen.y *= p, E.positionScreen.x *= o, E.positionScreen.y *= p, ca.overdraw && (ka(u.positionScreen, r.positionScreen), ka(r.positionScreen, E.positionScreen), ka(E.positionScreen, u.positionScreen)), X.add3Points(u.positionScreen.x, u.positionScreen.y, r.positionScreen.x, r.positionScreen.y, E.positionScreen.x, E.positionScreen.y), ma.intersects(X) && C(u, r, E, 0, 1, 2, U, ca, a); else if (U instanceof THREE.RenderableFace4) u = U.v1, r = U.v2, E = U.v3, N = U.v4, u.positionScreen.x *= o, u.positionScreen.y *= p, r.positionScreen.x *= o, r.positionScreen.y *= p, E.positionScreen.x *= o, E.positionScreen.y *= p, N.positionScreen.x *= o, N.positionScreen.y *= p, W.positionScreen.copy(r.positionScreen), da.positionScreen.copy(N.positionScreen), ca.overdraw && (ka(u.positionScreen, r.positionScreen), ka(r.positionScreen, N.positionScreen), ka(N.positionScreen, u.positionScreen), ka(E.positionScreen, W.positionScreen), ka(E.positionScreen, da.positionScreen)), X.addPoint(u.positionScreen.x, u.positionScreen.y), X.addPoint(r.positionScreen.x, r.positionScreen.y), X.addPoint(E.positionScreen.x, E.positionScreen.y), X.addPoint(N.positionScreen.x, N.positionScreen.y), ma.intersects(X) && Q(u, r, E, N, W, da, U, ca, a); Z.addRectangle(X) } k.setTransform(1, 0, 0, 1, 0, 0) } }; THREE.RenderableVertex = function() { this.positionWorld = new THREE.Vector3; this.positionScreen = new THREE.Vector4; this.visible = !0 }; THREE.RenderableVertex.prototype.copy = function(a) { this.positionWorld.copy(a.positionWorld); this.positionScreen.copy(a.positionScreen) }; THREE.RenderableFace3 = function() { this.v1 = new THREE.RenderableVertex; this.v2 = new THREE.RenderableVertex; this.v3 = new THREE.RenderableVertex; this.centroidWorld = new THREE.Vector3; this.centroidScreen = new THREE.Vector3; this.normalWorld = new THREE.Vector3; this.vertexNormalsWorld = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3]; this.faceMaterial = this.material = null; this.uvs = [ [] ]; this.z = null }; THREE.RenderableFace4 = function() { this.v1 = new THREE.RenderableVertex; this.v2 = new THREE.RenderableVertex; this.v3 = new THREE.RenderableVertex; this.v4 = new THREE.RenderableVertex; this.centroidWorld = new THREE.Vector3; this.centroidScreen = new THREE.Vector3; this.normalWorld = new THREE.Vector3; this.vertexNormalsWorld = [new THREE.Vector3, new THREE.Vector3, new THREE.Vector3, new THREE.Vector3]; this.faceMaterial = this.material = null; this.uvs = [ [] ]; this.z = null }; THREE.RenderableObject = function() { this.z = this.object = null }; THREE.RenderableParticle = function() { this.rotation = this.z = this.y = this.x = null; this.scale = new THREE.Vector2; this.material = null }; THREE.RenderableLine = function() { this.z = null; this.v1 = new THREE.RenderableVertex; this.v2 = new THREE.RenderableVertex; this.material = null }; function randomRange(t, i) { return Math.random() * (i - t) + t } Particle3D = function(t) { THREE.Particle.call(this, t), this.velocity = new THREE.Vector3(0, -2, 0), this.velocity.rotateX(randomRange(-45, 45)), this.velocity.rotateY(randomRange(0, 360)), this.gravity = new THREE.Vector3(0, 0, 0), this.drag = 1 }, Particle3D.prototype = new THREE.Particle, Particle3D.prototype.constructor = Particle3D, Particle3D.prototype.updatePhysics = function() { this.velocity.multiplyScalar(this.drag), this.velocity.addSelf(this.gravity), this.position.addSelf(this.velocity) }; var TO_RADIANS = Math.PI / 180; THREE.Vector3.prototype.rotateY = function(t) { cosRY = Math.cos(t * TO_RADIANS), sinRY = Math.sin(t * TO_RADIANS); var i = this.z, o = this.x; this.x = o * cosRY + i * sinRY, this.z = o * -sinRY + i * cosRY }, THREE.Vector3.prototype.rotateX = function(t) { cosRY = Math.cos(t * TO_RADIANS), sinRY = Math.sin(t * TO_RADIANS); var i = this.z, o = this.y; this.y = o * cosRY + i * sinRY, this.z = o * -sinRY + i * cosRY }, THREE.Vector3.prototype.rotateZ = function(t) { cosRY = Math.cos(t * TO_RADIANS), sinRY = Math.sin(t * TO_RADIANS); var i = this.x, o = this.y; this.y = o * cosRY + i * sinRY, this.x = o * -sinRY + i * cosRY }; $(function() { var container = document.querySelector(".snowback"); if (/MSIE 6|MSIE 7|MSIE 8/.test(navigator.userAgent)) { return } else { if (/MSIE 9|MSIE 10/.test(navigator.userAgent)) { $(container).css("height", $(window).height()).bind("click", function() { $(this).remove() }) } } var containerWidth = $(container).width(); var containerHeight = $(container).height(); var particle; var camera; var scene; var renderer; var mouseX = 0; var mouseY = 0; var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; var particles = []; var particleImage = new Image(); particleImage.src = "./image/snow.png"; var snowNum = 500; function init() { camera = new THREE.PerspectiveCamera(75, containerWidth / containerHeight, 1, 10000); camera.position.z = 1000; scene = new THREE.Scene(); scene.add(camera); renderer = new THREE.CanvasRenderer(); renderer.setSize(containerWidth, containerHeight); var material = new THREE.ParticleBasicMaterial({ map: new THREE.Texture(particleImage) }); for (var i = 0; i < snowNum; i++) { particle = new Particle3D(material); particle.position.x = Math.random() * 2000 - 1000; particle.position.y = Math.random() * 2000 - 1000; particle.position.z = Math.random() * 2000 - 1000; particle.scale.x = particle.scale.y = 1; scene.add(particle); particles.push(particle) } container.appendChild(renderer.domElement); document.addEventListener("mousemove", onDocumentMouseMove, false); setInterval(loop, 1000 / 40) } function onDocumentMouseMove(event) { mouseX = event.clientX - windowHalfX; mouseY = event.clientY - windowHalfY } function onDocumentTouchStart(event) { if (event.touches.length == 1) { event.preventDefault(); mouseX = event.touches[0].pageX - windowHalfX; mouseY = event.touches[0].pageY - windowHalfY } } function onDocumentTouchMove(event) { if (event.touches.length == 1) { event.preventDefault(); mouseX = event.touches[0].pageX - windowHalfX; mouseY = event.touches[0].pageY - windowHalfY } } function loop() { for (var i = 0; i < particles.length; i++) { var particle = particles[i]; particle.updatePhysics(); with(particle.position) { if (y < -1000) { y += 2000 } if (x > 1000) { x -= 2000 } else { if (x < -1000) { x += 2000 } } if (z > 1000) { z -= 2000 } else { if (z < -1000) { z += 2000 } } } } camera.position.x += (mouseX - camera.position.x) * 0.005; camera.position.y += (-mouseY - camera.position.y) * 0.005; camera.lookAt(scene.position); renderer.render(scene, camera) } init() });
加载全部内容