好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

HTML5 3D衣服摇摆动画特效

这又是一款基于 HTML5 canvas 的3D动画杰作,它是一个可以随风飘动的3D衣服摇摆动画特效,非常逼真。当我们将鼠标滑过衣服时,衣服将会出现摇摆的动画,点击鼠标时,衣服将会更加剧烈地摆动。

在线演示 &nbs p; 源码下载

HT ML 代码

XM L/HTML Code 复制内容到剪贴板

< div   style = "width:500px ;m arg in:10px auto" >      < canvas   id = "cv"   width = "480"   h ei ght = "300" > </ canvas >      < p > "3D on 2D Canvas" demo </ p >      < p > move cursor to pan / click to swing </ p >    </ div >   

P3 D库JS代码,主要用来处理3D效果的

JavaScript Code 复制内容到剪贴板

window.P3D = {     texture:  null ,     g:  null    };       P3D.clear =  function (f, w, h) {      VAR  g =  this .g;     g.be gin Path();     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   vb d = [ 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.l inet o(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.re Store ();         return   true ;    }       P3D.draw test ByIndexBuffer =  function (pos_buf, ix_buf, culling) {      var  g =  this .g;         if  ((ix_buf.length%3) != 0)       t hr ow   "invalid index buffer length!" ;         var  len = ix_buf.length/3;         var  i, ibase, vbase;      var  poss = [{},{},{}];     g. stroke Width = 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  PR oduct < 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 & am p;& (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.prototy PE  = {     zero:  function () {       this .x =  this .y =  this .z = 0;     },        s ub :  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 ;     },        copy From :  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 ;     },        dpW IT h:  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 .copyF rom (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 . SETUP Transforms();          this .generateCloth(180);       this .generateRenderTriangles();          var  _this =  this ;       this .canvas.addEventListener( "mou SEM ove" ,  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 = un define d;        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  n br  = 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 -t op 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衣服摇摆动画特效的 源 码介绍,需要更为深入学习的下载源代码来研究。

总结

以上是 为你收集整理的 HTML5 3D衣服摇摆动画特效 全部内容,希望文章能够帮你解决 HTML5 3D衣服摇摆动画特效 所遇到的问题。

如果觉得 网站内容还不错, 推荐好友。

查看更多关于HTML5 3D衣服摇摆动画特效的详细内容...

  阅读:16次