Rumah  >  Artikel  >  hujung hadapan web  >  HTML5 animasi hayunan pakaian 3D kesan khas_html5 kemahiran tutorial

HTML5 animasi hayunan pakaian 3D kesan khas_html5 kemahiran tutorial

WBOY
WBOYasal
2016-05-16 15:45:421970semak imbas

Ini adalah satu lagi karya animasi 3D berdasarkan HTML5 Canvas Ia adalah kesan khas animasi hayunan pakaian 3D yang boleh berkibar ditiup angin, yang sangat realistik. Apabila kita meluncurkan tetikus ke atas pakaian, pakaian akan mempunyai animasi bergoyang Apabila kita mengklik tetikus, pakaian akan dihayun dengan lebih ganas.

Demo dalam talian Muat turun kod sumber

Kod HTML

Kod XML/HTMLSalin kandungan ke papan keratan
  1. <div gaya="lebar:500px;margin :10px auto">
  2. <kanvas id="cv" lebar="480" tinggi="300">kanvas> 
  3. <p>demo "3D on 2D Canvas"< /p>
  4. <p>gerakkan kursor ke pan / klik untuk mengayun< ;/p> 
  5. div>

Kod JS perpustakaan P3D, terutamanya digunakan untuk memproses kesan 3D

Kod JavaScriptSalin kandungan ke papan keratan
  1. tetingkap.P3D = {   
  2.  tekstur: null,   
  3.  g: null  
  4. };   
  5.   
  6. P3D.clear = fungsi(f, w, h) {   
  7.  var g = ini.g;   
  8.  g.beginPath();   
  9.  g.fillStyle = f;   
  10.  g.fillRect(0, 0, w, h);   
  11.   
  12. }   
  13.   
  14. P3D.num_cmp = fungsi(a,b){kembali a-b;}  
  15.   
  16. P3D.drawTriangle = fungsi(poss, uvs, shade_clr) {   
  17.  var w = ini.texture.width;   
  18.  var h = ini.texture.height;   
  19.   
  20.  var g = ini.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 = baharu 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.  jika (!im) kembali palsu;   
  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.  // sempadan   
  65.  var bx = [wu, wu vA[0], wu vB[0]];   
  66.  var oleh = [hv, hv vA[1], hv vB[1]];   
  67.   
  68.  bx.sort(P3D.num_cmp);   
  69.  mengikut.sort(P3D.num_cmp);   
  70.   
  71.  var bw = bx[2] - bx[0];   
  72.  var bh = oleh[2] - oleh[0];   
  73.   
  74.  jika ((bx[0] bw) <= (w-1)) bw ;   
  75.  jika ((oleh[0] bh) <= (h-1)) bh ;   
  76.  jika (bx[0] >= 1) {bx[0]--; bw ;}   
  77.  jika (oleh[0] >= 1) {oleh[0]--; bh ;}   
  78.   
  79.  g.drawImage(ini.tekstur, bx[0], oleh[0], bw, bh, bx[0], oleh[0], bw, bh);   
  80.   
  81.  jika (shade_clr) {   
  82.   g.fillStyle = shade_clr;   
  83.   g.fillRect(bx[0], oleh[0], bw, bh);   
  84.  }   
  85.   
  86.  g.restore();   
  87.   
  88.  kembali benar;   
  89. }   
  90.   
  91. P3D.drawTestByIndexBuffer = fungsi(pos_buf, ix_buf, pemusnahan) {   
  92.  var g = ini.g;   
  93.   
  94.  jika ((ix_buf.length%3) != 0)   
  95.   lontar "panjang penampan indeks tidak sah!";   
  96.   
  97.  var len = ix_buf.length/3;   
  98.   
  99.  var i, ibase, vbase;   
  100.  var poss = [{},{},{}];   
  101.  g.strokeWidth = 1;   
  102.  untuk (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 komponen produk bersilang < 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))*cull) < 0);   
  124.   
  125.   g.beginPath();   
  126.   g.strokeStyle = cull ? "#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 = fungsi(pos_buf, ix_buf, tx_buf, culling, z_clip) {   
  136.  var w, h;   
  137.  var color_polygon = !ini.tekstur;   
  138.  jika (ini.tekstur) {   
  139.   w = ini.tekstur.lebar;   
  140.   h = ini.tekstur.tinggi;   
  141.  }  
  142.   
  143.  var g = ini.g;   
  144.  var m = baharu M22();   
  145.   
  146.  jika (!pemusnahan) pemusnahan = 0;   
  147.   
  148.  jika ((ix_buf.length%3) != 0)   
  149.   lontar "panjang penampan indeks tidak sah!";   
  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.  untuk (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.   jika (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {ibase  = 2; teruskan;}   
  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.   jika (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) { ibase; teruskan;}   
  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.   jika (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {teruskan 🎜>;}  
  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 komponen produk bersilang < 0 ?   
  181.   jika( (((vAd[0] * vCd[1]) - (vAd[1] * vCd[0]))*culling) < ;  0)   
  182.    teruskan;   
  183.   
  184.   jika (warna_poligon) {   
  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.    teruskan;   
  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.   jika (!im) { teruskan;}  
  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.   // sempadan   
  227.   var bx = [wu, wu vA[0], wu vB[0]];   
  228.   var oleh = [hv, hv vA[1], hv vB[1]];   
  229.   bx.sort(P3D.num_cmp);   
  230.   mengikut.sort(P3D.num_cmp);   
  231.   var bw = bx[2] - bx[0];   
  232.   var bra = oleh[2] - oleh[0];   
  233.   jika ((bx[0] bw) <= (w-1)) bw ;   
  234.   jika ((oleh[0] coli) <= (h-1)) bra ;   
  235.   jika (bx[0] >= 1) {bx[0]--; bw ;}   
  236.   jika (oleh[0] >= 1) {oleh[0]--; coli ;}   
  237.   g.drawImage(ini.tekstur, bx[0], oleh[0], bw, bh, bx[0], oleh[0], bw, coli);   
  238. /*
  239.   jika (shade_clr) {  
  240.    g.fillStyle = shade_clr;  
  241.    g.fillRect(bx[0], oleh[0], bw, bh);  
  242.   }  
  243. */
  244.   g.restore();   
  245. }  
  246.   
  247. }   
  248.   
  249. fungsi Vec3(_x, _y, _z)   
  250. {   
  251.  ini.x = _x || 0;   
  252.  ini.y = _y || 0;   
  253.  ini.z = _z || 0;   
  254. }   
  255.   
  256. Vec3.prototype = {   
  257.  sifar: fungsi() {   
  258.   ini.x = ini.y = ini.z = 0;   
  259.  }, ​​  
  260.   
  261.  sub: fungsi(v) {   
  262.   ini.x -= v.x;   
  263.   ini.y -= v.y;   
  264.   ini.z -= v.z;   
  265.   
  266.   kembali ini;   
  267.  }, ​​  
  268.   
  269.  tambah: fungsi(v) {   
  270.   ini.x  = v.x;   
  271.   ini.y  = v.y;   
  272.   ini.z  = v.z;   
  273.   
  274.   kembali ini;   
  275.  }, ​​  
  276.   
  277.  salinan Daripada: fungsi(v) {   
  278.   ini.x = v.x;   
  279.   ini.y = v.y;   
  280.   ini.z = v.z;   
  281.   
  282.   kembali ini;   
  283.  }, ​​  
  284.   
  285.  norma:fungsi() {   
  286.   kembali Math.sqrt(ini.x*ini.x   ini.y*ini.y   ini.z *ini.z);   
  287.  },   
  288.   
  289.  normalkan: fungsi() {   
  290.   var nrm = Math.sqrt(ini.x*ini.x   ini.y*ini.y   ini .z*ini.z);   
  291.   jika (nrm != 0)   
  292.   {   
  293.    ini.x /= nrm;   
  294.    ini.y /= nrm;   
  295.    ini.z /= nrm;   
  296.   }   
  297.   kembali ini;   
  298.  }, ​​  
  299.   
  300.  smul: fungsi(k) {   
  301.   ini.x *= k;   
  302.   ini.y *= k;   
  303.   ini.z *= k;   
  304.   
  305.   kembali ini;   
  306.  }, ​​  
  307.   
  308.  dpDengan: fungsi(v) {   
  309.   kembali ini.x*v.x   ini. y*v.y   ini.z*v.z;   
  310.  }, ​​  
  311.   
  312.  cp: fungsi(v, w) {   
  313.   ini.x = (w.y * v.z) - (w.z * v.y);   
  314.   ini.y = (w.z * v.x) - (w.x * v.z);   
  315.   ini.z = (w.x * v.y) - (w.y * v.x);   
  316.   
  317.   kembali ini;   
  318.  }, ​​  
  319.   
  320.  kepadaString: fungsi() {   
  321.   kembali ini.x   ", "   ini.y   ","   ini.z;   
  322.  }   
  323. }  
  324.   
  325. fungsi M44(cpy)   
  326. {   
  327.  jika (cpy)   
  328.   ini.copyFrom(cpy);   
  329.  lain {   
  330.   ini.ident();   
  331.  }   
  332. }   
  333.   
  334. M44.prototype = {   
  335.  ident: fungsi() {   
  336.      ini._12 = ini._13 = iniini
  337. ._14 = 0;   
  338.   ini._21 =       ini._23 = ini
  339. ini
  340. ._24 = 0;      ini._31 = ini._32 =       ini
  341. iniini._34 = 0;      ini._41 = ini
  342. ._42 = 
  343. ini
  344. ._43 =       0;   
  345.      ini._11 = ini._22 = ini
  346. ._33 = 
  347. ini
  348. ._44 = 1;   
  349.      kembali
  350.  
  351. ini;     },   
  352.   
  353.  salinan Daripada: fungsi(m) {   
  354.   ini._11 = m._11;   
  355.   ini._12 = m._12;   
  356.   ini._13 = m._13;   
  357.   ini._14 = m._14;   
  358.   
  359.   ini._21 = m._21;   
  360.   ini._22 = m._22;   
  361.   ini._23 = m._23;   
  362.   ini._24 = m._24;   
  363.   
  364.   ini._31 = m._31;   
  365.   ini._32 = m._32;   
  366.   ini._33 = m._33;   
  367.   ini._34 = m._34;   
  368.   
  369.   ini._41 = m._41;   
  370.   ini._42 = m._42;   
  371.   ini._43 = m._43;   
  372.   ini._44 = m._44;   
  373.   
  374.   kembali ini;   
  375.  }, ​​  
  376.   
  377.  transVec3: fungsi(keluar, x, y, z) {   
  378.   keluar[0] = x * ini._11   y * ini._21   z > ini._31   ini._41;   
  379.   keluar[1] = x * ini._12   y * ini._22   z > ini._32   ini._42;   
  380.   keluar[2] = x * 
  381. ini._13   y * ini._23   z > ini._33   ini._43;      keluar[3] = x * 
  382. ini._14   y * ini._24   z > ini._34   ini._44;     },   
  383.   
  384.  transVec3Rot: fungsi(keluar, x, y, z) {   
  385.   keluar[0] = x * ini._11   y * ini._21   z > ini._31;   
  386.   keluar[1] = x * ini._12   y * ini._22   z > ini._32;   
  387.   keluar[2] = x * 
  388. ini._13   y * ini._23   z > ini._33;     }, ​​  
  389.   
  390.  perspektifLH: 
  391. fungsi(vw, vh, z_near, z_far) {      
  392. ini._11 = 2.0*z_near/vw;      
  393. ini._12 = 0;      
  394. ini._13 = 0;      
  395. ini._14 = 0;      
  396.   
  397. ini._21 = 0;      
  398. ini._22 = 2*z_near/vh;      
  399. ini._23 = 0;      
  400. ini._24 = 0;      
  401.   
  402. ini._31 = 0;      
  403. ini._32 = 0;      
  404. ini._33 = z_far/(z_far-z_near);      
  405. ini._34 = 1;      
  406.   
  407. ini._41 = 0;      
  408. ini._42 = 0;      
  409. ini._43 = z_near*z_far/(z_near-z_far);      
  410. ini._44 = 0;      
  411.   
  412. kembali ini;     },   
  413.   
  414.  lookAtLH: fungsi(aUp, aFrom, aAt) {   
  415.   var aX = baharu Vec3();   
  416.   var aY = baharu Vec3();   
  417.   
  418.   var aZ = baharu Vec3(aAt.x, aAt.y, aAt.z);   
  419.   aZ.sub(aFrom).normalize();   
  420.   
  421.   aX.cp(aUp, aZ).normalize();   
  422.   aY.cp(aZ, aX);   
  423.   
  424.   ini._11 = aX.x;  ini._12 = aY.x;  ini._13 = aZ.x;  ini._14 = 0;   
  425.   ini._21 = aX.y;  ini._22 = aY.y;  ini._23 = aZ.y;  ini._24 = 0;   
  426.   ini._31 = aX.z;  ini._32 = aY.z;  ini._33 = aZ.z;  ini._34 = 0;   
  427.   
  428.   ini._41 = -aFrom.dpWith(aX);   
  429.   ini._42 = -aFrom.dpWith(aY);   
  430.   ini._43 = -aFrom.dpWith(aZ);   
  431.   ini._44 = 1;   
  432.   
  433.      kembali ini;   
  434.  },   
  435.   
  436.  mul: fungsi(A, B) {   
  437.   ini._11 = A._11*B._11     A._12*B._21     A._13*B._31     A._11     A._12*B._21     A._13*B._31     A._14 ;   
  438.   ini._12 = A._11*B._12     A._12*B._22     A._13*B._32     A._12     A._12*B._22     A._13*B._32     A._12 ;   
  439.   ini._13 = A._11*B._13     A._12*B._23     A._13*B._33     A._13     A._12*B._23     A._13*B._33     A._14 ;   
  440.   ini._14 = A._11*B._14      A._12*B._24     A._13*B._34     A._44 ;   
  441.   
  442.   ini._21 = A._21*B._11     A._22*B._21     A._23*B._31     A._24 ;   
  443.   ini._22 = A._21*B._12     A._22*B._22     A._23*B._32     A._24 ;   
  444.   ini._23 = A._21*B._13     A._22*B._23     A._23*B._33     A._24 ;   
  445.   ini._24 = A._21*B._14      A._22*B._24     A._23*B._34     A._44 ;   
  446.   
  447.   ini._31 = A._31*B._11     A._32*B._21     A._33*B._31     A._44 ;   
  448.   ini._32 = A._31*B._12     A._32*B._22     A._33*B._32     B._44 ;   
  449.   ini._33 = A._31*B._13     A._32*B._23     A._33*B._33     A._34 ;   
  450.   ini._34 = A._31*B._14      A._32*B._24     A._33*B._34     A._44 ;   
  451.   
  452.   ini._41 = A._41*B._11     A._42*B._21     A._43*B._31     A._44 ;   
  453.   ini._42 = A._41*B._12     A._42*B._22     A._43*B._32     A._44 ;   
  454.   ini._43 = A._41*B._13     A._42*B._23     A._43*B._33     A._44 ;   
  455.   ini._44 = A._41*B._14      A._42*B._24     A._43*B._34     A._44 ;   
  456.   
  457.   kembali ini;   
  458.  },   
  459.   
  460.  übersetzen: Funktion(x, y, z) {   
  461.   dieses._11 = 1;  dies._12 = 0;  dies._13 = 0;  dieses._14 = 0;   
  462.   dieses._21 = 0;  dieses._22 = 1;  dieses._23 = 0;  dieses._24 = 0;   
  463.   dieses._31 = 0;  dieses._32 = 0;  dieses._33 = 1;  dieses._34 = 0;   
  464.   
  465.   dieses._41 = x;  dies._42 = y;  dieses._43 = z;  dieses._44 = 1;   
  466.   zurückgeben dies;   
  467.  }, ​​  
  468.   
  469.  transpose33: Funktion() {   
  470.   var t;   
  471.   
  472.   t = dieses._12;   
  473.   dieses._12 = dieses._21;   
  474.   dieses._21 = t;   
  475.   
  476.   t = dies._13;   
  477.   dieses._13 = dieses._31;   
  478.   dieses._31 = t;   
  479.   
  480.   t = dies._23;   
  481.   dieses._23 = dieses._32;   
  482.   dieses._32 = t;   
  483.   
  484.   zurückgeben dies;   
  485.  },   
  486.   
  487.  // Rotation im OpenGL-Stil   
  488.  glRotate: Funktion(Winkel, x, y, z) {   
  489.   var s = Math.sin( angle );   
  490.   var c = Math.cos( angle );   
  491.   
  492.   var xx = x * x;   
  493.   var yy = y * y;   
  494.   var zz = z * z;   
  495.   var xy = x * y;   
  496.   var yz = y * z;   
  497.   var zx = z * x;   
  498.   var xs = x * s;   
  499.   var ys = y * s;   
  500.   var zs = z * s;   
  501.   var one_c = 1.0 - c;   
  502. /*  
  503.   this._11 = (one_c * xx)   c;  
  504.   this._21 = (one_c * xy) - zs;  
  505.   this._31 = (one_c * zx)   ys;  
  506.   this._41 = 0;  
  507.  
  508.   this._12 = (one_c * xy)   zs;  
  509.   this._22 = (one_c * yy)   c;  
  510.   this._32 = (one_c * yz) - xs;  
  511.   this._42 = 0;  
  512.  
  513.   this._13 = (one_c * zx) - ys;  
  514.   this._23 = (one_c * yz)   xs;  
  515.   this._33 = (one_c * zz)   c;  
  516.   this._43 = 0;  
  517.  
Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn