Maison  >  Article  >  interface Web  >  HTML5 3D vêtements swing animation effets spéciaux_html5 compétences tutoriel

HTML5 3D vêtements swing animation effets spéciaux_html5 compétences tutoriel

WBOY
WBOYoriginal
2016-05-16 15:45:421983parcourir

Il s'agit d'un autre chef-d'œuvre d'animation 3D basé sur HTML5 Canvas. Il s'agit d'un effet spécial d'animation de balançoire de vêtements 3D qui peut flotter dans le vent, ce qui est très réaliste. Lorsque nous passons la souris sur les vêtements, les vêtements auront une animation de balancement. Lorsque nous cliquons sur la souris, les vêtements se balanceront plus violemment.

Démo en ligne Téléchargement du code source

Code HTML

Code XML/HTMLCopier le contenu dans le presse-papiers
  1. <div style="largeur : 500 px ; marge :10px auto">
  2. <toile id="cv" largeur="480" hauteur="300">toile> 
  3. <p>Démo "3D sur toile 2D"< /p>
  4. <p>déplacer le curseur pour faire un panoramique / cliquer pour balancer< ;/p> 
  5. div>

Code JS de la bibliothèque P3D, principalement utilisé pour traiter les effets 3D

Code JavaScriptCopier le contenu dans le presse-papiers
  1. window.P3D = {   
  2.  texture : null,   
  3.  g : null  
  4. } ;   
  5.   
  6. P3D.clear = fonction(f, w, h) {   
  7.  var g = ceci.g;   
  8.  g.beginPath();   
  9.  g.fillStyle = f;   
  10.  g.fillRect(0, 0, w, h);   
  11.   
  12. }   
  13.   
  14. P3D.num_cmp = fonction(a,b){retour a-b;}  
  15.   
  16. P3D.drawTriangle = fonction(poss, uvs, shade_clr) {   
  17.  var w = ce.texture.width;   
  18.  var h = ce.texture.height;   
  19.   
  20.  var g = ceci.g;   
  21.   
  22.  var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;   
  23.  var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;   
  24.   
  25.  var vA = [ uvs[1].u - uvs[0].u , uvs[1].v - uvs[0].v ] ;   
  26.  var vB = [ uvs[2].u - uvs[0].u , uvs[2].v - uvs[0].v ] ;   
  27.   
  28.  vA[0] *= w;   
  29.  vA[1] *= h;   
  30.   
  31.  vB[0] *= w;   
  32.  vB[1] *= h;   
  33.   
  34.  var m = nouveau M22();   
  35.  m._11 = vA[0];   
  36.  m._12 = vA[1];   
  37.  m._21 = vB[0];   
  38.  m._22 = vB[1];   
  39.   
  40.  var im = m.getInvert();   
  41.  si (!im) retour faux;   
  42.   
  43.  var a = im._11 * vAd[0]   im._12 * vBd[0];   
  44.  var b = im._21 * vAd[0]   im._22 * vBd[0];   
  45.   
  46.  var c = im._11 * vAd[1]   im._12 * vBd[1];   
  47.  var d = im._21 * vAd[1]   im._22 * vBd[1];   
  48.   
  49.  var wu = uvs[0].u * w;   
  50.  var hv = uvs[0].v * h;   
  51.  var du = wu * a   hv * b;   
  52.  var dv = wu * c   hv * d;   
  53.   
  54.  g.save();   
  55.   
  56.  g.beginPath();   
  57.  g.moveTo(poss[0].x, poss[0].y);   
  58.  g.lineTo(poss[1].x, poss[1].y);   
  59.  g.lineTo(poss[2].x, poss[2].y);   
  60.  g.clip();   
  61.   
  62.  g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  63.   
  64.  // limites   
  65.  var bx = [wu, wu vA[0], wu vB[0]];   
  66.  var par = [hv, hv vA[1], hv vB[1]];   
  67.   
  68.  bx.sort(P3D.num_cmp);   
  69.  by.sort(P3D.num_cmp);   
  70.   
  71.  var bw = bx[2] - bx[0];   
  72.  var bh = par[2] - par[0];   
  73.   
  74.  if ((bx[0] bw) <= (w-1)) bw ;   
  75.  if ((by[0] bh) <= (h-1)) bh ;   
  76.  si (bx[0] >= 1) {bx[0]--; p.c. ;}   
  77.  if (par[0] >= 1) {par[0]--; bh ;}   
  78.   
  79.  g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], pc, bh );   
  80.   
  81.  si (shade_clr) {   
  82.   g.fillStyle = shade_clr;   
  83.   g.fillRect(bx[0], by[0], bw, bh);   
  84.  }   
  85.   
  86.  g.restore();   
  87.   
  88.  retour vrai ;   
  89. }   
  90.   
  91. P3D.drawTestByIndexBuffer = fonction(pos_buf, ix_buf, culling) {   
  92.  var g = ceci.g;   
  93.   
  94.  if ((ix_buf.length%3) != 0)   
  95.   lancer "longueur du tampon d'index invalide !" ;   
  96.   
  97.  var len = ix_buf.length/3;   
  98.   
  99.  var i, ibase, vbase ;   
  100.  var poss = [{},{},{}];   
  101.  g.StrokeWidth = 1 ;   
  102.  pour (i = 0, ibase = 0;i < len; i)   
  103.  {   
  104.   vbase = ix_buf[ibase ] << 2 ;   
  105.   poss[0].x = pos_buf[vbase ];   
  106.   poss[0].y = pos_buf[vbase  ];   
  107.   
  108.   vbase = ix_buf[ibase ] << 2 ;   
  109.   poss[1].x = pos_buf[vbase ];   
  110.   poss[1].y = pos_buf[vbase  ];   
  111.   
  112.   vbase = ix_buf[ibase ] << 2 ;   
  113.   poss[2].x = pos_buf[vbase ];   
  114.   poss[2].y = pos_buf[vbase  ];   
  115.   
  116.   // z composant de produits croisés < 0 ?   
  117.   
  118.   var Ax = poss[1].x - poss[0].x;   
  119.   var Ay = poss[1].y - poss[0].y;   
  120.   var Cx = poss[2].x - poss[1].x;   
  121.   var Cy = poss[2].y - poss[1].y;   
  122.   
  123.   var cull = ( (((Ax * Cy) - (Ay * Cx))*culling) < 0);   
  124.   
  125.   g.beginPath();   
  126.   g.StrokeStyle = élimination ? "#592" : "#0f0";   
  127.   g.moveTo(poss[0].x, poss[0].y);   
  128.   g.lineTo(poss[1].x, poss[1].y);   
  129.   g.lineTo(poss[2].x, poss[2].y);   
  130.   g.lineTo(poss[0].x, poss[0].y);   
  131.   g.Stroke();   
  132.  }   
  133. }   
  134.   
  135. P3D.drawByIndexBuffer = fonction(pos_buf, ix_buf, tx_buf, culling, z_clip) {   
  136.  var w, h;   
  137.  var color_polygon = !ce.texture;   
  138.  si (ce.texture) {   
  139.   w = ce.texture.width;   
  140.   h = ce.texture.height;   
  141.  }  
  142.   
  143.  var g = ceci.g;   
  144.  var m = nouveau M22();   
  145.   
  146.  if (!culling) culling = 0 ;   
  147.   
  148.  if ((ix_buf.length%3) != 0)   
  149.   lancer "longueur du tampon d'index invalide !" ;   
  150.   
  151.  var i, ibase, vbase, tbase, poss = [{},{},{}];   
  152.  var len = ix_buf.length/3;   
  153.  var uv_0u, uv_0v, uv_1u, uv_1v, uv_2u, uv_2v ;   
  154.   
  155.  pour (i = 0, ibase = 0;i < len; i)   
  156.  {   
  157.   tbase = ix_buf[ibase ] << 1   
  158.   vbase = tbase << 1 ;   
  159.   poss[0].x = pos_buf[vbase ]; uv_0u = tx_buf[tbase] ;   
  160.   poss[0].y = pos_buf[vbase ]; uv_0v = tx_buf[tbase] ;   
  161.   if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {ibase  = 2; continuer;}   
  162.   
  163.   tbase = ix_buf[ibase ] << 1   
  164.   vbase = tbase << 1 ;   
  165.   poss[1].x = pos_buf[vbase ]; uv_1u = tx_buf[tbase] ;   
  166.   poss[1].y = pos_buf[vbase ]; uv_1v = tx_buf[tbase] ;   
  167.   if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) { ibase; continuer;}   
  168.   
  169.   tbase = ix_buf[ibase ] << 1   
  170.   vbase = tbase << 1 ;   
  171.   poss[2].x = pos_buf[vbase ]; uv_2u = tx_buf[tbase] ;   
  172.   poss[2].y = pos_buf[vbase ]; uv_2v = tx_buf[tbase] ;   
  173.   if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {continuer;}  
  174.   
  175.   var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;   
  176.   var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;   
  177.   
  178.   var vCd = [ poss[2].x - poss[1].x , poss[2].y - poss[1].y ] ;   
  179.   
  180.   // z composant de produits croisés < 0 ?   
  181.   if( ((vAd[0] * vCd[1]) - (vAd[1] * vCd[0]))*abattage) < ; 0)   
  182.    continuer ;   
  183.   
  184.   si (color_polygon) {   
  185.    g.fillStyle = uv_0u;   
  186.   
  187.    g.beginPath();   
  188.    g.moveTo(poss[0].x, poss[0].y);   
  189.    g.lineTo(poss[1].x, poss[1].y);   
  190.    g.lineTo(poss[2].x, poss[2].y);   
  191.    g.fill();   
  192.    continuer ;   
  193.   }   
  194.   
  195.   var vA = [ uv_1u - uv_0u , uv_1v - uv_0v ];   
  196.   var vB = [ uv_2u - uv_0u , uv_2v - uv_0v ];   
  197.   
  198.   vA[0] *= w;   
  199.   vA[1] *= h;   
  200.   
  201.   vB[0] *= w;   
  202.   vB[1] *= h;   
  203.   
  204.   m._11 = vA[0];   
  205.   m._12 = vA[1];   
  206.   m._21 = vB[0];   
  207.   m._22 = vB[1];   
  208.   
  209.   var im = m.getInvert();   
  210.   si (!im) { continuer;}  
  211.   var a = im._11 * vAd[0]   im._12 * vBd[0];   
  212.   var b = im._21 * vAd[0]   im._22 * vBd[0];   
  213.   var c = im._11 * vAd[1]   im._12 * vBd[1];   
  214.   var d = im._21 * vAd[1]   im._22 * vBd[1];   
  215.   var wu = uv_0u * w;   
  216.   var hv = uv_0v * h;   
  217.   var du = wu * a   hv * b;   
  218.   var dv = wu * c   hv * d;   
  219.   g.save();   
  220.   g.beginPath();   
  221.   g.moveTo(poss[0].x, poss[0].y);   
  222.   g.lineTo(poss[1].x, poss[1].y);   
  223.   g.lineTo(poss[2].x, poss[2].y);   
  224.   g.clip();   
  225.   g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  226.   // limites   
  227.   var bx = [wu, wu vA[0], wu vB[0]];   
  228.   var par = [hv, hv vA[1], hv vB[1]];   
  229.   bx.sort(P3D.num_cmp);   
  230.   by.sort(P3D.num_cmp);   
  231.   var bw = bx[2] - bx[0];   
  232.   var soutien-gorge = by[2] - by[0];   
  233.   if ((bx[0] bw) <= (w-1)) bw ;   
  234.   if ((by[0] soutien-gorge) <= (h-1)) soutien-gorge ;   
  235.   si (bx[0] >= 1) {bx[0]--; p.c. ;}   
  236.   if (par[0] >= 1) {par[0]--; soutien-gorge ;}   
  237.   g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], pc, soutien-gorge);   
  238. /*
  239.   si (shade_clr) {  
  240.    g.fillStyle = shade_clr;  
  241.    g.fillRect(bx[0], by[0], bw, bh);  
  242.   }  
  243. */
  244.   g.restore();   
  245. }  
  246.   
  247. }   
  248.   
  249. fonction Vec3(_x, _y, _z)   
  250. {   
  251.  ce.x = _x || 0 ;   
  252.  ce.y = _y || 0 ;   
  253.  ce.z = _z || 0 ;   
  254. }   
  255.   
  256. Vec3.prototype = {   
  257.  zéro : fonction() {   
  258.   ce.x = ce.y = ce.z = 0 ;   
  259.  }, ​​  
  260.   
  261.  sous : fonction(v) {   
  262.   ce.x -= v.x;   
  263.   ce.y -= v.y;   
  264.   ce.z -= v.z;   
  265.   
  266.   retourner ceci ;   
  267.  }, ​​  
  268.   
  269.  ajouter : fonction(v) {   
  270.   ceci.x  = v.x;   
  271.   ce.y  = v.y;   
  272.   ce.z  = v.z;   
  273.   
  274.   retourner ceci ;   
  275.  }, ​​  
  276.   
  277.  copyFrom : fonction(v) {   
  278.   ce.x = v.x;   
  279.   ce.y = v.y;   
  280.   ce.z = v.z;   
  281.   
  282.   retourner ceci ;   
  283.  }, ​​  
  284.   
  285.  norme :fonction() {   
  286.   return Math.sqrt(this.x*this.x   ce.y*ce.y   ce.z *ce.z);   
  287.  },   
  288.   
  289.  normaliser : fonction() {   
  290.   var nrm = Math.sqrt(ce.x*ce.x   ce.y*ce.y   ce .z*ce.z);   
  291.   si (nrm != 0)   
  292.   {   
  293.    ce.x /= nrm;   
  294.    ce.y /= nrm;   
  295.    ceci.z /= nrm;   
  296.   }   
  297.   retourner ceci ;   
  298.  }, ​​  
  299.   
  300.  smul : fonction(k) {   
  301.   ce.x *= k ;   
  302.   ce.y *= k ;   
  303.   ce.z *= k ;   
  304.   
  305.   retourner ceci ;   
  306.  }, ​​  
  307.   
  308.  dpWith : fonction(v) {   
  309.   retourner ce.x*v.x   ce. y*v.y   ceci.z*v.z;   
  310.  }, ​​  
  311.   
  312.  cp : fonction(v, w) {   
  313.   ce.x = (w.y * v.z) - (w.z * v.y);   
  314.   ce.y = (w.z * v.x) - (w.x * v.z);   
  315.   ce.z = (w.x * v.y) - (w.y * v.x);   
  316.   
  317.   retourner ceci ;   
  318.  }, ​​  
  319.   
  320.  toString : fonction() {   
  321.   retourner ce.x   ", "   ce.y   ","   ce.z;   
  322.  }   
  323. }  
  324.   
  325. fonction M44(cpy)   
  326. {   
  327.  si (cpy)   
  328.   ceci.copyFrom(cpy);   
  329.  autre {   
  330.   ce.ident();   
  331.  }   
  332. }   
  333.   
  334. M44.prototype = {   
  335.  ident : fonction() {   
  336.      ceci._12 = ceci._13 = ceci._14 = 0 ;   
  337.   ceci._21 =       ceci._23 = ceci._24 = 0 ;   
  338.   ceci._31 = ceci._32 =       ceci._34 = 0 ;   
  339.   ceci._41 = ceci._42 = ceci._43 =       0 ;   
  340.   
  341.   ceci._11 = ceci._22 = ceci._33 = ceci._44 = 1 ;   
  342.   
  343.   retourner ceci ;   
  344.  },   
  345.   
  346.  copyFrom : fonction(m) {   
  347.   ce._11 = m._11;   
  348.   ceci._12 = m._12;   
  349.   ce._13 = m._13;   
  350.   ceci._14 = m._14;   
  351.   
  352.   ceci._21 = m._21;   
  353.   ceci._22 = m._22;   
  354.   ceci._23 = m._23;   
  355.   ceci._24 = m._24;   
  356.   
  357.   ce._31 = m._31;   
  358.   ceci._32 = m._32;   
  359.   ceci._33 = m._33;   
  360.   ceci._34 = m._34;   
  361.   
  362.   ceci._41 = m._41;   
  363.   ceci._42 = m._42;   
  364.   ceci._43 = m._43;   
  365.   ceci._44 = m._44;   
  366.   
  367.   retourner ceci ;   
  368.  }, ​​  
  369.   
  370.  transVec3 : fonction(out, x, y, z) {   
  371.   out[0] = x * ceci._11   y * ceci._21   z *  ce._31   ce._41;   
  372.   out[1] = x * ce._12   y * ce._22   z *  ce._32   ce._42;   
  373.   out[2] = x * ce._13   y * ce._23   z *  ce._33   ce._43;   
  374.   out[3] = x * ceci._14   y * ceci._24   z *  ce._34   ce._44;   
  375.  },   
  376.   
  377.  transVec3Rot : fonction(out, x, y, z) {   
  378.   out[0] = x * ceci._11   y * ceci._21   z *  ce._31;   
  379.   out[1] = x * ce._12   y * ce._22   z *  ce._32;   
  380.   out[2] = x * ce._13   y * ce._23   z *  ce._33;   
  381.  }, ​​  
  382.   
  383.  perspectiveLH : fonction(vw, vh, z_near, z_far) {   
  384.   ce._11 = 2.0*z_near/vw;   
  385.   ce._12 = 0 ;   
  386.   ceci._13 = 0 ;   
  387.   ceci._14 = 0 ;   
  388.   
  389.   ceci._21 = 0 ;   
  390.   ce._22 = 2*z_near/vh;   
  391.   ceci._23 = 0 ;   
  392.   ceci._24 = 0 ;   
  393.   
  394.   ce._31 = 0 ;   
  395.   ce._32 = 0 ;   
  396.   ce._33 = z_far/(z_far-z_near);   
  397.   ce._34 = 1 ;   
  398.   
  399.   ceci._41 = 0 ;   
  400.   ceci._42 = 0 ;   
  401.   ce._43 = z_near*z_far/(z_near-z_far);   
  402.   ceci._44 = 0 ;   
  403.   
  404.   retourner ceci ;   
  405.  },   
  406.   
  407.  lookAtLH : fonction(aUp, aFrom, aAt) {   
  408.   var aX = nouveau Vec3();   
  409.   var aY = nouveau Vec3();   
  410.   
  411.   var aZ = nouveau Vec3(aAt.x, aAt.y, aAt.z);   
  412.   aZ.sub(aFrom).normalize();   
  413.   
  414.   aX.cp(aUp, aZ).normalize();   
  415.   aY.cp(aZ, aX);   
  416.   
  417.   ceci._11 = aX.x;  ce._12 = aY.x;  ce._13 = aZ.x;  ce._14 = 0;   
  418.   ceci._21 = aX.y;  ce._22 = aY.y;  ce._23 = aZ.y;  ce._24 = 0 ;   
  419.   ce._31 = aX.z;  ce._32 = aY.z;  ce._33 = aZ.z;  ce._34 = 0;   
  420.   
  421.   ce._41 = -aFrom.dpWith(aX);   
  422.   ceci._42 = -aFrom.dpWith(aY);   
  423.   ceci._43 = -aFrom.dpWith(aZ);   
  424.   ceci._44 = 1 ;   
  425.   
  426.      retourner ceci ;   
  427.  },   
  428.   
  429.  mul : fonction(A, B) {   
  430.   ce._11 = A._11*B._11     A._12*B._21     A._13*B._31     A._14*B._41 ;   
  431.   ce._12 = A._11*B._12     A._12*B._22     A._13*B._32     A._14*B._42 ;   
  432.   ceci._13 = A._11*B._13     A._12*B._23     A._13*B._33     A._14*B._43 ;   
  433.   ceci._14 = A._11*B._14     A._12*B._24     A._13*B._34     A._14*B._44 ;   
  434.   
  435.   ce._21 = A._21*B._11     A._22*B._21     A._23*B._31     A._24*B._41 ;   
  436.   ceci._22 = A._21*B._12     A._22*B._22     A._23*B._32     A._24*B._42 ;   
  437.   ceci._23 = A._21*B._13     A._22*B._23     A._23*B._33     A._24*B._43 ;   
  438.   ceci._24 = A._21*B._14     A._22*B._24     A._23*B._34     A._24*B._44 ;   
  439.   
  440.   ceci._31 = A._31*B._11     A._32*B._21     A._33*B._31     A._34*B._41 ;   
  441.   ceci._32 = A._31*B._12     A._32*B._22     A._33*B._32     A._34*B._42 ;   
  442.   ceci._33 = A._31*B._13     A._32*B._23     A._33*B._33     A._34*B._43 ;   
  443.   ceci._34 = A._31*B._14     A._32*B._24     A._33*B._34     A._34*B._44 ;   
  444.   
  445.   ceci._41 = A._41*B._11     A._42*B._21     A._43*B._31     A._44*B._41 ;   
  446.   ce._42 = A._41*B._12     A._42*B._22     A._43*B._32     A._44*B._42 ;   
  447.   ceci._43 = A._41*B._13     A._42*B._23     A._43*B._33     A._44*B._43 ;   
  448.   ceci._44 = A._41*B._14     A._42*B._24     A._43*B._34     A._44*B._44 ;   
  449.   
  450.   retourner ceci ;   
  451.  },   
  452.   
  453.  翻譯: 函數(x, y, z) {   
  454.   ._11 = 1;  . 🎜>._13 = 0;  ._14 = 0;      
  455. ._21 = 0;  ._23 = 0;  ._24 = 0;      ._31 = 0;  ._32 = 0; 🎜>
  456. ._33 = 1;  
  457. ._34 = 0;         ._41 = x;  這個._🎜>
  458. ._43 = z;  
  459. ._44 = 1;   
  460.    ;     }、  
  461.     transpose33: 函數() {   
  462.   var
  463.  t;   
  464.      t = 
  465. ._12;      這個
  466. ._12 = 
  467. ._21;     ._21 = t;   
  468.      t = ._13;   
  469.   這個._13 = 
  470. 這個._31;  
  471.   ._31 = t;   
  472.      t = ._23;   
  473.   ._23 = 
  474. ._32;     
  475. ._32 = t;      
  476.    ;   
  477.  },
  478. // OpenGL スタイルの回転
  479. glRotate: 関数(角度, x, y, z) {
  480. var s = Math.sin( angle );   
  481. var c = Math.cos( angle );   
  482. var xx = x * x;   
  483. var yy = y * y;   
  484. var zz = z * z;   
  485. var xy = x * y;   
  486. var yz = y * z;   
  487. var zx = z * x;   
  488. var xs = x * s;   
  489. var ys = y * s;   
  490. var zs = z * s;   
  491. var one_c = 1.0 - c;   
  492. /*
  493. this._11 = (one_c * xx) c;
  494. this._21 = (one_c * xy) - zs;
  495. this._31 = (one_c * zx) ys;
  496. this._41 = 0;
  497. this._12 = (one_c * xy) zs;
  498. this._22 = (one_c * yy) c;
  499. this._32 = (one_c * yz) - xs;
  500. this._42 = 0;
  501. this._13 = (one_c * zx) - ys;
  502. this._23 = (one_c * yz) xs;
  503. this._33 = (one_c * zz) c;
  504. this._43 = 0;
Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn