HTML5 3D衣服摇摆动画特效
程序员文章站
2022-10-15 18:07:54
这篇文章主要为大家分享了一款HTML5 3D衣服摇摆动画特效,一款基于HTML5 Canvas的3D动画杰作,感兴趣的小伙伴们可以参考一下... 16-03-17...
这又是一款基于html5 canvas的3d动画杰作,它是一个可以随风飘动的3d衣服摇摆动画特效,非常逼真。当我们将鼠标滑过衣服时,衣服将会出现摇摆的动画,点击鼠标时,衣服将会更加剧烈地摆动。
html代码
xml/html code复制内容到剪贴板
- <div style="width:500px;margin:10px auto">
- <canvas id="cv" width="480" height="300"></canvas>
- <p>"3d on 2d canvas" demo</p>
- <p>move cursor to pan / click to swing</p>
- </div>
p3d库js代码,主要用来处理3d效果的
javascript code复制内容到剪贴板
- window.p3d = {
- texture: null,
- g: null
- };
- p3d.clear = function(f, w, h) {
- var g = this.g;
- g.beginpath();
- g.fillstyle = f;
- g.fillrect(0, 0, w, h);
- }
- p3d.num_cmp = function(a,b){return a-b;}
- p3d.drawtriangle = function(poss, uvs, shade_clr) {
- var w = this.texture.width;
- var h = this.texture.height;
- var g = this.g;
- var vad = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ];
- var vbd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ];
- var va = [ uvs[1].u - uvs[0].u , uvs[1].v - uvs[0].v ];
- var vb = [ uvs[2].u - uvs[0].u , uvs[2].v - uvs[0].v ];
- va[0] *= w;
- va[1] *= h;
- vb[0] *= w;
- vb[1] *= h;
- var m = new m22();
- m._11 = va[0];
- m._12 = va[1];
- m._21 = vb[0];
- m._22 = vb[1];
- var im = m.getinvert();
- if (!im) return false;
- var a = im._11 * vad[0] + im._12 * vbd[0];
- var b = im._21 * vad[0] + im._22 * vbd[0];
- var c = im._11 * vad[1] + im._12 * vbd[1];
- var d = im._21 * vad[1] + im._22 * vbd[1];
- var wu = uvs[0].u * w;
- var hv = uvs[0].v * h;
- var du = wu * a + hv * b;
- var dv = wu * c + hv * d;
- g.save();
- g.beginpath();
- g.moveto(poss[0].x, poss[0].y);
- g.lineto(poss[1].x, poss[1].y);
- g.lineto(poss[2].x, poss[2].y);
- g.clip();
- g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);
- // bounds
- var bx = [wu, wu+va[0], wu+vb[0]];
- var by = [hv, hv+va[1], hv+vb[1]];
- bx.sort(p3d.num_cmp);
- by.sort(p3d.num_cmp);
- var bw = bx[2] - bx[0];
- var bh = by[2] - by[0];
- if ((bx[0]+bw) <= (w-1)) bw++;
- if ((by[0]+bh) <= (h-1)) bh++;
- if (bx[0] >= 1) {bx[0]--; bw++;}
- if (by[0] >= 1) {by[0]--; bh++;}
- g.drawimage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw, bh);
- if (shade_clr) {
- g.fillstyle = shade_clr;
- g.fillrect(bx[0], by[0], bw, bh);
- }
- g.restore();
- return true;
- }
- p3d.drawtestbyindexbuffer = function(pos_buf, ix_buf, culling) {
- var g = this.g;
- if ((ix_buf.length%3) != 0)
- throw "invalid index buffer length!";
- var len = ix_buf.length/3;
- var i, ibase, vbase;
- var poss = [{},{},{}];
- g.strokewidth = 1;
- for (i = 0, ibase = 0;i < len;++i)
- {
- vbase = ix_buf[ibase++] << 2;
- poss[0].x = pos_buf[vbase++];
- poss[0].y = pos_buf[vbase ];
- vbase = ix_buf[ibase++] << 2;
- poss[1].x = pos_buf[vbase++];
- poss[1].y = pos_buf[vbase ];
- vbase = ix_buf[ibase++] << 2;
- poss[2].x = pos_buf[vbase++];
- poss[2].y = pos_buf[vbase ];
- // z component of cross product < 0 ?
- var ax = poss[1].x - poss[0].x;
- var ay = poss[1].y - poss[0].y;
- var cx = poss[2].x - poss[1].x;
- var cy = poss[2].y - poss[1].y;
- var cull = ( (((ax * cy) - (ay * cx))*culling) < 0);
- g.beginpath();
- g.strokestyle = cull ? "#592" : "#0f0";
- g.moveto(poss[0].x, poss[0].y);
- g.lineto(poss[1].x, poss[1].y);
- g.lineto(poss[2].x, poss[2].y);
- g.lineto(poss[0].x, poss[0].y);
- g.stroke();
- }
- }
- p3d.drawbyindexbuffer = function(pos_buf, ix_buf, tx_buf, culling, z_clip) {
- var w, h;
- var color_polygon = !this.texture;
- if (this.texture) {
- w = this.texture.width;
- h = this.texture.height;
- }
- var g = this.g;
- var m = new m22();
- if (!culling) culling = 0;
- if ((ix_buf.length%3) != 0)
- throw "invalid index buffer length!";
- var i, ibase, vbase, tbase, poss = [{},{},{}];
- var len = ix_buf.length/3;
- var uv_0u, uv_0v, uv_1u, uv_1v, uv_2u, uv_2v;
- for (i = 0, ibase = 0;i < len;++i)
- {
- tbase = ix_buf[ibase++] << 1
- vbase = tbase << 1;
- poss[0].x = pos_buf[vbase++]; uv_0u = tx_buf[tbase++];
- poss[0].y = pos_buf[vbase++]; uv_0v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {ibase += 2; continue;}
- tbase = ix_buf[ibase++] << 1
- vbase = tbase << 1;
- poss[1].x = pos_buf[vbase++]; uv_1u = tx_buf[tbase++];
- poss[1].y = pos_buf[vbase++]; uv_1v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {++ibase; continue;}
- tbase = ix_buf[ibase++] << 1
- vbase = tbase << 1;
- poss[2].x = pos_buf[vbase++]; uv_2u = tx_buf[tbase++];
- poss[2].y = pos_buf[vbase++]; uv_2v = tx_buf[tbase];
- if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {continue;}
- var vad = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ];
- var vbd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ];
- var vcd = [ poss[2].x - poss[1].x , poss[2].y - poss[1].y ];
- // z component of cross product < 0 ?
- if( (((vad[0] * vcd[1]) - (vad[1] * vcd[0]))*culling) < 0)
- continue;
- if (color_polygon) {
- g.fillstyle = uv_0u;
- g.beginpath();
- g.moveto(poss[0].x, poss[0].y);
- g.lineto(poss[1].x, poss[1].y);
- g.lineto(poss[2].x, poss[2].y);
- g.fill();
- continue;
- }
- var va = [ uv_1u - uv_0u , uv_1v - uv_0v ];
- var vb = [ uv_2u - uv_0u , uv_2v - uv_0v ];
- va[0] *= w;
- va[1] *= h;
- vb[0] *= w;
- vb[1] *= h;
- m._11 = va[0];
- m._12 = va[1];
- m._21 = vb[0];
- m._22 = vb[1];
- var im = m.getinvert();
- if (!im) { continue;}
- var a = im._11 * vad[0] + im._12 * vbd[0];
- var b = im._21 * vad[0] + im._22 * vbd[0];
- var c = im._11 * vad[1] + im._12 * vbd[1];
- var d = im._21 * vad[1] + im._22 * vbd[1];
- var wu = uv_0u * w;
- var hv = uv_0v * h;
- var du = wu * a + hv * b;
- var dv = wu * c + hv * d;
- g.save();
- g.beginpath();
- g.moveto(poss[0].x, poss[0].y);
- g.lineto(poss[1].x, poss[1].y);
- g.lineto(poss[2].x, poss[2].y);
- g.clip();
- g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);
- // bounds
- var bx = [wu, wu+va[0], wu+vb[0]];
- var by = [hv, hv+va[1], hv+vb[1]];
- bx.sort(p3d.num_cmp);
- by.sort(p3d.num_cmp);
- var bw = bx[2] - bx[0];
- var bh = by[2] - by[0];
- if ((bx[0]+bw) <= (w-1)) bw++;
- if ((by[0]+bh) <= (h-1)) bh++;
- if (bx[0] >= 1) {bx[0]--; bw++;}
- if (by[0] >= 1) {by[0]--; bh++;}
- g.drawimage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw, bh);
- /*
- if (shade_clr) {
- g.fillstyle = shade_clr;
- g.fillrect(bx[0], by[0], bw, bh);
- }
- */
- g.restore();
- }
- }
- function vec3(_x, _y, _z)
- {
- this.x = _x || 0;
- this.y = _y || 0;
- this.z = _z || 0;
- }
- vec3.prototype = {
- zero: function() {
- this.x = this.y = this.z = 0;
- },
- sub: function(v) {
- this.x -= v.x;
- this.y -= v.y;
- this.z -= v.z;
- return this;
- },
- add: function(v) {
- this.x += v.x;
- this.y += v.y;
- this.z += v.z;
- return this;
- },
- copyfrom: function(v) {
- this.x = v.x;
- this.y = v.y;
- this.z = v.z;
- return this;
- },
- norm:function() {
- return math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z);
- },
- normalize: function() {
- var nrm = math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z);
- if (nrm != 0)
- {
- this.x /= nrm;
- this.y /= nrm;
- this.z /= nrm;
- }
- return this;
- },
- smul: function(k) {
- this.x *= k;
- this.y *= k;
- this.z *= k;
- return this;
- },
- dpwith: function(v) {
- return this.x*v.x + this.y*v.y + this.z*v.z;
- },
- cp: function(v, w) {
- this.x = (w.y * v.z) - (w.z * v.y);
- this.y = (w.z * v.x) - (w.x * v.z);
- this.z = (w.x * v.y) - (w.y * v.x);
- return this;
- },
- tostring: function() {
- return this.x + ", " + this.y + "," + this.z;
- }
- }
- function m44(cpy)
- {
- if (cpy)
- this.copyfrom(cpy);
- else {
- this.ident();
- }
- }
- m44.prototype = {
- ident: function() {
- this._12 = this._13 = this._14 = 0;
- this._21 = this._23 = this._24 = 0;
- this._31 = this._32 = this._34 = 0;
- this._41 = this._42 = this._43 = 0;
- this._11 = this._22 = this._33 = this._44 = 1;
- return this;
- },
- copyfrom: function(m) {
- this._11 = m._11;
- this._12 = m._12;
- this._13 = m._13;
- this._14 = m._14;
- this._21 = m._21;
- this._22 = m._22;
- this._23 = m._23;
- this._24 = m._24;
- this._31 = m._31;
- this._32 = m._32;
- this._33 = m._33;
- this._34 = m._34;
- this._41 = m._41;
- this._42 = m._42;
- this._43 = m._43;
- this._44 = m._44;
- return this;
- },
- transvec3: function(out, x, y, z) {
- out[0] = x * this._11 + y * this._21 + z * this._31 + this._41;
- out[1] = x * this._12 + y * this._22 + z * this._32 + this._42;
- out[2] = x * this._13 + y * this._23 + z * this._33 + this._43;
- out[3] = x * this._14 + y * this._24 + z * this._34 + this._44;
- },
- transvec3rot: function(out, x, y, z) {
- out[0] = x * this._11 + y * this._21 + z * this._31;
- out[1] = x * this._12 + y * this._22 + z * this._32;
- out[2] = x * this._13 + y * this._23 + z * this._33;
- },
- perspectivelh: function(vw, vh, z_near, z_far) {
- this._11 = 2.0*z_near/vw;
- this._12 = 0;
- this._13 = 0;
- this._14 = 0;
- this._21 = 0;
- this._22 = 2*z_near/vh;
- this._23 = 0;
- this._24 = 0;
- this._31 = 0;
- this._32 = 0;
- this._33 = z_far/(z_far-z_near);
- this._34 = 1;
- this._41 = 0;
- this._42 = 0;
- this._43 = z_near*z_far/(z_near-z_far);
- this._44 = 0;
- return this;
- },
- lookatlh: function(aup, afrom, aat) {
- var ax = new vec3();
- var ay = new vec3();
- var az = new vec3(aat.x, aat.y, aat.z);
- az.sub(afrom).normalize();
- ax.cp(aup, az).normalize();
- ay.cp(az, ax);
- this._11 = ax.x; this._12 = ay.x; this._13 = az.x; this._14 = 0;
- this._21 = ax.y; this._22 = ay.y; this._23 = az.y; this._24 = 0;
- this._31 = ax.z; this._32 = ay.z; this._33 = az.z; this._34 = 0;
- this._41 = -afrom.dpwith(ax);
- this._42 = -afrom.dpwith(ay);
- this._43 = -afrom.dpwith(az);
- this._44 = 1;
- return this;
- },
- mul: function(a, b) {
- this._11 = a._11*b._11 + a._12*b._21 + a._13*b._31 + a._14*b._41;
- this._12 = a._11*b._12 + a._12*b._22 + a._13*b._32 + a._14*b._42;
- this._13 = a._11*b._13 + a._12*b._23 + a._13*b._33 + a._14*b._43;
- this._14 = a._11*b._14 + a._12*b._24 + a._13*b._34 + a._14*b._44;
- this._21 = a._21*b._11 + a._22*b._21 + a._23*b._31 + a._24*b._41;
- this._22 = a._21*b._12 + a._22*b._22 + a._23*b._32 + a._24*b._42;
- this._23 = a._21*b._13 + a._22*b._23 + a._23*b._33 + a._24*b._43;
- this._24 = a._21*b._14 + a._22*b._24 + a._23*b._34 + a._24*b._44;
- this._31 = a._31*b._11 + a._32*b._21 + a._33*b._31 + a._34*b._41;
- this._32 = a._31*b._12 + a._32*b._22 + a._33*b._32 + a._34*b._42;
- this._33 = a._31*b._13 + a._32*b._23 + a._33*b._33 + a._34*b._43;
- this._34 = a._31*b._14 + a._32*b._24 + a._33*b._34 + a._34*b._44;
- this._41 = a._41*b._11 + a._42*b._21 + a._43*b._31 + a._44*b._41;
- this._42 = a._41*b._12 + a._42*b._22 + a._43*b._32 + a._44*b._42;
- this._43 = a._41*b._13 + a._42*b._23 + a._43*b._33 + a._44*b._43;
- this._44 = a._41*b._14 + a._42*b._24 + a._43*b._34 + a._44*b._44;
- return this;
- },
- translate: function(x, y, z) {
- this._11 = 1; this._12 = 0; this._13 = 0; this._14 = 0;
- this._21 = 0; this._22 = 1; this._23 = 0; this._24 = 0;
- this._31 = 0; this._32 = 0; this._33 = 1; this._34 = 0;
- this._41 = x; this._42 = y; this._43 = z; this._44 = 1;
- return this;
- },
- transpose33: function() {
- var t;
- t = this._12;
- this._12 = this._21;
- this._21 = t;
- t = this._13;
- this._13 = this._31;
- this._31 = t;
- t = this._23;
- this._23 = this._32;
- this._32 = t;
- return this;
- },
- // opengl style rotation
- glrotate: function(angle, x, y, z) {
- var s = math.sin( angle );
- var c = math.cos( angle );
- var xx = x * x;
- var yy = y * y;
- var zz = z * z;
- var xy = x * y;
- var yz = y * z;
- var zx = z * x;
- var xs = x * s;
- var ys = y * s;
- var zs = z * s;
- var one_c = 1.0 - c;
- /*
- this._11 = (one_c * xx) + c;
- this._21 = (one_c * xy) - zs;
- this._31 = (one_c * zx) + ys;
- this._41 = 0;
- this._12 = (one_c * xy) + zs;
- this._22 = (one_c * yy) + c;
- this._32 = (one_c * yz) - xs;
- this._42 = 0;
- this._13 = (one_c * zx) - ys;
- this._23 = (one_c * yz) + xs;
- this._33 = (one_c * zz) + c;
- this._43 = 0;
- this._14 = 0;
- this._24 = 0;
- this._34 = 0;
- this._44 = 1;
- */
- this._11 = (one_c * xx) + c;
- this._12 = (one_c * xy) - zs;
- this._13 = (one_c * zx) + ys;
- this._14 = 0;
- this._21 = (one_c * xy) + zs;
- this._22 = (one_c * yy) + c;
- this._23 = (one_c * yz) - xs;
- this._24 = 0;
- this._31 = (one_c * zx) - ys;
- this._32 = (one_c * yz) + xs;
- this._33 = (one_c * zz) + c;
- this._34 = 0;
- this._41 = 0;
- this._42 = 0;
- this._43 = 0;
- this._44 = 1;
- return this;
- }
- }
- // matrix 2x2
- function m22()
- {
- this._11 = 1;
- this._12 = 0;
- this._21 = 0;
- this._22 = 1;
- }
- m22.prototype.getinvert = function()
- {
- var out = new m22();
- var det = this._11 * this._22 - this._12 * this._21;
- if (det > -0.0001 && det < 0.0001)
- return null;
- out._11 = this._22 / det;
- out._22 = this._11 / det;
- out._12 = -this._12 / det;
- out._21 = -this._21 / det;
- return out;
- }
3d衣服动画js代码
javascript code复制内容到剪贴板
- function clothapp()
- {
- this.canvas = document.getelementbyid("cv");
- p3d.g = this.canvas.getcontext("2d");
- var tex = new image();
- this.texture1 = tex;
- tex.onload = function(){ _this.start(); };
- tex.src = "20090226032826.gif";
- tex = new image();
- this.texture2 = tex;
- tex.onload = function(){ _this.start(); };
- tex.src = "20090226032825.png";
- this.mloadcount = 2;
- this.mtickcount = 0;
- this.g = 0.53;
- this.g1 = 0.45;
- this.mprojmat = null;
- this.mviewmat = null;
- this.mviewfrom = new vec3();
- this.mviewfrom.y = -150;
- this.mviewfrom.z = 1000;
- this.mviewfroma = (new vec3()).copyfrom(this.mviewfrom);
- this.mviewangle = 0;
- this.mnlen = 0;
- this.mnodes = [];
- this.mrendertris = null;
- this.mltnode = null;
- this.mrtnode = null;
- this.mltnodev = new vec3();
- this.mrtnodev = new vec3();
- this.mwforce = new vec3();
- this.frate = 15;
- var _this = this;
- }
- clothapp.zsortcmp = function(t1, t2) {
- return t2.sortkey - t1.sortkey;
- }
- clothapp.prototype = {
- start: function() {
- if (--this.mloadcount != 0) return;
- this.vup = new vec3(0, 1, 0);
- this.vat = new vec3(0, 80, 0);
- this.mviewport = {};
- this.mviewport.w = 480;
- this.mviewport.h = 300;
- this.mviewport.ow = 240;
- this.mviewport.oh = 150;
- this.setuptransforms();
- this.generatecloth(180);
- this.generaterendertriangles();
- var _this = this;
- this.canvas.addeventlistener("mousemove", function(e){_this.onmousemove(e);}, false);
- this.canvas.addeventlistener("mousedown", function(e){_this.onclick(e);}, false);
- window.settimeout(function(){_this.oninterval();}, this.frate);
- },
- oninterval: function() {
- this.mtickcount++;
- // this.mltnodev.z = math.cos(this.mtickcount*0.1) * 2;
- this.tick();
- this.updateposition();
- this.draw();
- var _this = this;
- window.settimeout(function(){_this.oninterval();}, this.frate);
- },
- onmousemove: function(e) {
- if (e.clientx || e.clientx == 0)
- this.mviewangle = (e.clientx - 240) * 0.004;
- if (e.clienty || e.clienty == 0)
- this.mviewfroma.y = 90 - (e.clienty - 0) * 0.8;
- },
- onclick: function(e) {
- if (e.clientx || e.clientx == 0)
- {
- this.mwforce.z = -4;
- this.mwforce.x = (e.clientx - 240) * -0.03;
- }
- },
- tick: function() {
- this.updateviewtrans(this.mviewangle);
- var nlen = this.mnodes.length;
- var i, nd;
- for(i = 0;i < nlen;i++)
- {
- nd = this.mnodes[i];
- nd.f.x = 0;
- nd.f.z = 0;
- if (nd.flags & 4)
- nd.f.y = -this.g1;
- else
- nd.f.y = -this.g;
- nd.f.add(this.mwforce);
- }
- this.mwforce.zero();
- this.applytension();
- for(i = 0;i < nlen;i++)
- {
- nd = this.mnodes[i];
- if ((nd.flags&1) != 0) {
- nd.f.sub(nd.f);
- }
- nd.velo.add(nd.f);
- }
- this.mltnode.velo.copyfrom(this.mltnodev);
- this.mrtnode.velo.copyfrom(this.mrtnodev);
- },
- updateposition: function() {
- var nlen = this.mnodes.length;
- var i, nd;
- for(i = 0;i < nlen;i++)
- {
- nd = this.mnodes[i];
- if ((nd.flags&1) != 0) {
- nd.cv.x = 0;
- nd.cv.y = 0;
- nd.cv.z = 0;
- }
- nd.pos.add(nd.velo);
- nd.velo.sub(nd.cv);
- nd.cv.x = 0;
- nd.cv.y = 0;
- nd.cv.z = 0;
- nd.velo.smul(0.95);
- }
- },
- draw: function() {
- p3d.clear("#000", this.mviewport.w, this.mviewport.h);
- this.transformpolygons();
- this.mrendertris.sort(clothapp.zsortcmp);
- var len = this.mrendertris.length;
- var t, sh;
- for (var i = 0;i < len;i++) {
- t = this.mrendertris[i];
- if (p3d.texture != t.texture)
- p3d.texture = t.texture;
- sh = undefined;
- if (t.lighting && t.shade > 0.01)
- sh = "rgba(0,0,0,"+t.shade+")";
- p3d.drawtriangle(t.tposs, t.uvs, sh);
- }
- },
- applytension: function() {
- var i, k, nd;
- var v = new vec3();
- var nlen = this.mnodes.length;
- var naturallen = this.mnlen;
- for (k = 0;k < nlen;k++)
- {
- nd = this.mnodes[k];
- var f = nd.f;
- for (i = 0;i < 4;i++)
- {
- var nbr = nd.links[i];
- if (!nbr) continue;
- var len = v.copyfrom(nbr.pos).sub(nd.pos).norm();
- var dlen = len - naturallen;
- if (dlen > 0) {
- v.smul(dlen * 0.5 / len);
- f.x += v.x;
- f.y += v.y;
- f.z += v.z;
- nd.cv.add(v.smul(0.8));
- }
- }
- }
- },
- setuptransforms: function() {
- this.mprojmat = new m44();
- this.mprojmat.perspectivelh(24, 15, 10, 9000);
- this.mviewmat = new m44();
- this.updateviewtrans(0);
- },
- updateviewtrans: function(ry) {
- this.mviewfroma.z = math.cos(ry) * 380;
- this.mviewfroma.x = math.sin(ry) * 380;
- this.mviewfrom.smul(0.7);
- this.mviewfrom.x += this.mviewfroma.x * 0.3;
- this.mviewfrom.y += this.mviewfroma.y * 0.3;
- this.mviewfrom.z += this.mviewfroma.z * 0.3;
- this.mviewmat.lookatlh(this.vup, this.mviewfrom, this.vat);
- },
- generatecloth: function(base_y) {
- var cols = 9;
- var rows = 8;
- var step = 22;
- this.mnlen = step*0.9;
- var w = (cols-1) * step;
- var i, k;
- for (k = 0;k < rows;k++)
- {
- for (i = 0;i < cols;i++)
- {
- var nd = new clothnode();
- nd.pos.x = -(w/2) + i*step;
- nd.pos.y = base_y -k*step/2;
- nd.pos.z = k*16;
- nd.uv.u = i / (cols-1);
- nd.uv.v = k / (rows-1);
- if (i > 0) {
- var prv_nd = this.mnodes[this.mnodes.length-1];
- prv_nd.links[1] = nd;
- nd.links[0] = prv_nd;
- }
- if (k > 0) {
- var up_nd = this.mnodes[this.mnodes.length-cols];
- up_nd.links[4] = nd;
- nd.links[3] = up_nd;
- }
- if (i != 0 && i != 4 && i != (cols-1))
- nd.flags |= 4;
- this.mnodes.push(nd);
- }
- }
- // fix left-top and right-top
- this.mnodes[0 ].flags |= 1;
- this.mnodes[4 ].flags |= 1;
- this.mnodes[cols-1].flags |= 1;
- this.mltnode = this.mnodes[0 ];
- this.mrtnode = this.mnodes[cols-1];
- },
- generaterendertriangles: function()
- {
- if (!this.mrendertris) this.mrendertris = [];
- var i;
- var nd;
- var nlen = this.mnodes.length;
- for(i = 0;i < nlen;i++)
- {
- nd = this.mnodes[i];
- if (nd.links[1] && nd.links[1].links[4]) {
- var t = new rendertriangle();
- t.texture = this.texture1;
- t.poss[0] = nd.pos;
- t.poss[1] = nd.links[1].pos;
- t.poss[2] = nd.links[1].links[4].pos;
- t.uvs[0] = nd.uv;
- t.uvs[1] = nd.links[1].uv;
- t.uvs[2] = nd.links[1].links[4].uv;
- this.mrendertris.push(t);
- t = new rendertriangle();
- t.texture = this.texture1;
- t.poss[0] = nd.pos;
- t.poss[1] = nd.links[1].links[4].pos;
- t.poss[2] = nd.links[4].pos;
- t.uvs[0] = nd.uv;
- t.uvs[1] = nd.links[1].links[4].uv;
- t.uvs[2] = nd.links[4].uv;
- this.mrendertris.push(t);
- }
- }
- this.addbgtriangles(this.mnodes[0].pos.y);
- },
- addbgtriangles: function(by) {
- var cols = 4;
- var t, x, y, sz = 110;
- var ox = -(cols*sz)/2;
- var oz = -(cols*sz)/2;
- for (y = 0;y < cols;y++) {
- for (x = 0;x < cols;x++) {
- var bv = ((x+y)&1) * 0.5;
- t = new rendertriangle();
- t.texture = this.texture2;
- t.poss[0] = new vec3(ox + x*sz , by, oz + y*sz );
- t.poss[1] = new vec3(ox + x*sz + sz, by, oz + y*sz );
- t.poss[2] = new vec3(ox + x*sz , by, oz + y*sz + sz);
- t.uvs[0] = {u:0 , v:bv };
- t.uvs[1] = {u:0.5, v:bv };
- t.uvs[2] = {u:0 , v:bv+0.5};
- if ((x==1 || x==2) && (y==1 || y==2))
- this.modifyroofuv(t, x == 2, bv);
- t.lighting = false;
- t.zbias = 0.5;
- this.mrendertris.push(t);
- t = new rendertriangle();
- t.texture = this.texture2;
- t.poss[0] = new vec3(ox + x*sz , by, oz + y*sz + sz);
- t.poss[1] = new vec3(ox + x*sz + sz, by, oz + y*sz );
- t.poss[2] = new vec3(ox + x*sz + sz, by, oz + y*sz + sz);
- t.uvs[0] = {u:0 , v:bv+0.5};
- t.uvs[1] = {u:0.5, v:bv };
- t.uvs[2] = {u:0.5, v:bv+0.5};
- if ((x==1 || x==2) && (y==1 || y==2))
- this.modifyroofuv(t, x == 2, bv);
- t.lighting = false;
- t.zbias = 0.5;
- this.mrendertris.push(t);
- }
- }
- },
- modifyroofuv: function(t, rv, bv) {
- if (rv) {
- t.uvs[0].u = 0.5 - t.uvs[0].u;
- t.uvs[1].u = 0.5 - t.uvs[1].u;
- t.uvs[2].u = 0.5 - t.uvs[2].u;
- }
- t.uvs[0].u += 0.5;
- t.uvs[1].u += 0.5;
- t.uvs[2].u += 0.5;
- if (rv) {
- t.uvs[0].v = 0.5 - t.uvs[0].v + bv + bv;
- t.uvs[1].v = 0.5 - t.uvs[1].v + bv + bv;
- t.uvs[2].v = 0.5 - t.uvs[2].v + bv + bv;
- }
- },
- transformpolygons: function() {
- var trans = new m44();
- trans.mul(this.mviewmat, this.mprojmat);
- var hw = this.mviewport.ow;
- var hh = this.mviewport.oh;
- var len = this.mrendertris.length;
- var t;
- var spos = [0, 0, 0, 0];
- for (var i = 0;i < len;i++) {
- t = this.mrendertris[i];
- for (var k = 0;k < 3;k++) {
- trans.transvec3(spos, t.poss[k].x, t.poss[k].y, t.poss[k].z);
- var w = spos[3];
- spos[0] /= w;
- spos[1] /= w;
- spos[2] /= w;
- spos[0] *= this.mviewport.w;
- spos[1] *= -this.mviewport.h;
- spos[0] += hw;
- spos[1] += hh;
- t.tposs[k].x = spos[0];
- t.tposs[k].y = spos[1];
- t.tposs[k].z = spos[2];
- }
- var v1 = (new vec3()).copyfrom(t.poss[1]).sub(t.poss[0]).normalize();
- var v2 = (new vec3()).copyfrom(t.poss[2]).sub(t.poss[1]).normalize();
- var n = (new vec3()).cp(v1, v2);
- trans.transvec3rot(spos, n.x, n.y, n.z);
- if (t.lighting) {
- if (spos[2] > 0)
- t.shade = 0.8
- else {
- t.shade = 0.1 - n.y * 0.6;
- if (t.shade < 0) t.shade = 0;
- }
- }
- t.sortkey = math.floor( (t.tposs[0].z + t.tposs[1].z + t.tposs[2].z + t.zbias) *1000 );
- }
- }
- }
- function clothnode()
- {
- this.flags = 0;
- this.pos = new vec3();
- this.velo = new vec3();
- this.cv = new vec3();
- this.f = new vec3();
- this.links = [null, null, null, null];
- this.uv = {u:0, v:0};
- }
- function rendertriangle()
- {
- this.texture = null;
- this.poss = new array(3);
- this.tposs = [new vec3(), new vec3(), new vec3()];
- this.uvs = [{u:0, v:0}, {u:0, v:0}, {u:0, v:0}];
- this.shade = 0;
- this.lighting = true;
- this.zbias = 0;
- this.sortkey = 0;
- }
以上就是html5 3d衣服摇摆动画特效的源码介绍,需要更为深入学习的下载源代码来研究。