首頁 > web前端 > H5教程 > HTML5 3D衣服搖擺動畫特效_html5教學技巧

HTML5 3D衣服搖擺動畫特效_html5教學技巧

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-05-16 15:45:42
原創
2056 人瀏覽過

這又是一款基於HTML5 Canvas的3D動畫傑作,它是一個可以隨風飄動的3D衣服搖擺動畫特效,非常逼真。當我們將老鼠滑過衣服時,衣服將會出現搖擺的動畫,點擊滑鼠時,衣服將會更加劇烈地擺動。

線上展示  原始碼下載

HTML程式碼

XML/HTML Code複製內容到剪貼簿
  1. div style=style=style=
  2. "wid:5000p; 10px auto"
  3. >    canvas id=id==> width="480"  >"300">
  4. canvas>   p>"3D on 2D Canvas" demo"3D on 2D Canvas" demop
  5. >
  6.     p>move cursor to 🎜>p>  
  7. div>  

P3D庫JS程式碼,主要用來處理3D效果的
JavaScript Code複製內容到剪貼簿
  1. window.P3D = {   
  2.  紋理: null、  
  3.  g: null  
  4. };   
  5.   
  6. P3D.clear = 函數(f, w, h) {   
  7.  var g = .g;  這個
  8. .g;  g.beginPath();   
  9. g.fillStyle = f;   
  10. g.fillRect(0, 0, w, h);   
  11.   
  12. }   
  13.   
  14. P3D.num_cmp = 函數(a,b){回傳 a-b;  
  15.   
  16. P3D.drawTriangle = 函數(poss, uvs, shade_clr) {   
  17.  var w = .
  18.  var h = .texture.height;  >這個.texture.height;   
  19.   
  20.  var g = .g;  這個
  21. .g;   
  22.  var vAd = [ poss[1].x - poss[0].x , poss[1].y - posy ;   
  23.  var vBd = [ poss[2].x - poss[0].x , poss[2].y -骨].y ;   
  24.   
  25.  var vA = [ uvs[1].u - uvs[0].u , uvs[1].v - uvs[0].u , uvs[1].v - ;   
  26.  var vB = [ uvs[2].u - uvs[0].u , uvs[2].v - uvs[0].u , uvs[2].v - s[0]. ;   
  27.   
  28.  vA[0] *= w;   
  29.  vA[1] *= h;   
  30.   
  31.  vB[0] *= w;   
  32.  vB[1] *= h;   
  33.   
  34.  var m =  
  35.  
  36. ;   
  37.  m._11 = vA[0];   
  38.  m._12 = vA[1];   
  39.  m._21 = vB[0];   
  40.  m._22 = vB[1];   
  41.     
  42. var
  43.  im = m.getInvert();     如果 (!im) 返回 
  44. ;
  45.     
  46. var
  47.  a = im._11 * vAd[0]   im._12 * vBd[0];    var
  48.  b = im._21 * vAd[0]   im._22 * vBd[0];  
  49.   
  50.  var c = im._11 * vAd[1]   im._12 * vBd[1];  
  51.  
  52. var d = im._21 * vAd[1]   im._22 * vBd[1];     
  53.  
  54. var
  55.  wu = uvs[0].u * w;     
  56. var
  57.  hv = uvs[0].v * h;     
  58. var
  59.  du = wu * a   hv * b;     
  60. var
  61.  dv = wu * c   hv * d;      
  62.  g.save();   
  63.   
  64.  g.beginPath();   
  65. g.moveTo(poss[0].x, poss[0].y);   
  66. g.lineTo(poss[1].x, poss[1].y);   
  67. g.lineTo(poss[2].x, poss[2].y);   
  68.  g.clip();   
  69.   
  70. g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  71.   
  72.  // 邊界  
  73.  var bx = [wu, wu vA[0], wu vB[0]];   
  74.  var by = [hv, hv vA[1], hv vB[1]];   
  75.   
  76.  bx.sort(P3D.num_cmp);   
  77.  by.sort(P3D.num_cmp);   
  78.   
  79.  var bw = bx[2] - bx[0];   
  80.  var bh = by[2] - by[0];   
  81.   
  82.  if ((bx[0] bw) 
  83.  if ((by[0] bh) 
  84.  if (bx[0] >= 1) {bx[0]--; 體重;}   
  85.  如果 (by[0] >= 1) {by[0]--; bh ;}   
  86.   
  87. g.drawImage(這個.texture, bx[0], by[0], bw, bh, bx[0], 由[0], bw、bh);   
  88.   
  89.   (shade_clr) {   
  90.   g.fillStyle = shade_clr;   
  91.   g.fillRect(bx[0], by[0], bw, bh);   
  92.  }   
  93.   
  94.  g.restore();   
  95.   
  96.  回傳 true;   
  97. }   
  98.   
  99. P3D.drawTestByIndexBuffer = (pos_buf, ix_buf, 清晰除) {  
  100. var g = .g;  這個.g;
  101.   
  102.  
  103. 如果 ((ix_buf.length%3) != 0)   
  104.   
  105.  「索引藍牙長度表!」;   
  106.   
  107.  
  108. var len = ix_buf.length/3;   
  109.   
  110.  
  111. var i、 ibase、 vbase;   
  112.  
  113. var poss = [{},{},{}];   
  114. g.linesWidth = 1;   
  115.   對於  (i = 0, ibase = 0;i 
  116.  {   
  117.   vbase = ix_buf[ibase ] 
  118.   poss[0].x = pos_buf[vbase ];   
  119.   poss[0].y = pos_buf[vbase  ];   
  120.   
  121.   vbase = ix_buf[ibase ] 
  122.   poss[1].x = pos_buf[vbase ];   
  123.   poss[1].y = pos_buf[vbase  ];   
  124.   
  125.   vbase = ix_buf[ibase ] 
  126.   poss[2].x = pos_buf[vbase ];   
  127.   poss[2].y = pos_buf[vbase  ];   
  128.   
  129.   //叉積的 z 數量  
  130.   
  131. var Ax = poss[1].x - poss[0].x;   
  132.   
  133. var Ay = poss[1].y - poss[0].y;   
  134.   var Cx = poss[2].x - poss[1].x;   
  135.   var Cy = poss[2].y - poss[1].y;   
  136.   
  137.   var 剔除 = ( (((Ax * Cy) - (Ay * Cx))*剔除時);   
  138.   
  139.   g.beginPath();   
  140.   g.linesStyle = 清晰除?      g.moveTo(poss[0].x, poss[0].y);      g.lineTo(poss[1].x, poss[1].y);   
  141.   g.lineTo(poss[2].x, poss[2].y);   
  142.   g.lineTo(poss[0].x, poss[0].y);   
  143.   g.中風();   
  144.  }   
  145. }   
  146.   
  147. P3D.drawByIndexBuffer = 
  148. 函數(pos_buf, ix_buf, tx_buf culling, z_clip)>
  149.  var w, h;   
  150.  var color_polygon = !
  151. .texture;     if (
  152. .texture) {   .texture) {      w = 
  153. .texture.width;   
  154.   h = 
  155. .texture.height;   
  156.  }  
  157.   
  158.  var g = .g;  這個
  159. .g;  var m =  
  160.  
  161. ;   
  162.     
  163. 如果
  164. (!剔除)剔除= 0;   
  165.     
  166. 如果
  167.  ((ix_buf.length%3) != 0)      拋出 
  168. 「索引緩衝區長度無效!」
  169. ;   
  170.     var
  171.  i, ibase, vbase, tbase, poss = [{},{},{}];  var len = ix_buf.length/3;   
  172.  var uv_0u、 uv_0v、 uv_1u、 uv_1v、 uv_2u、 uv_2v;   
  173.   
  174.  對於  (i = 0, ibase = 0;i 
  175.  {   
  176.   tbase = ix_buf[ibase ] 
  177.   vbase = tbase 
  178.   poss[0].x = pos_buf[vbase ]; uv_0u = tx_buf[tbase];   
  179.   poss[0].y = pos_buf[vbase ]; uv_0v = tx_buf[tbase];   
  180.   if (z_clip && (pos_buf[vbase] ;}   
  181.   
  182.   tbase = ix_buf[ibase ] 
  183.   vbase = tbase 
  184.   poss[1].x = pos_buf[vbase ]; uv_1u = tx_buf[tbase];   
  185.   poss[1].y = pos_buf[vbase ]; uv_1v = tx_buf[tbase];   
  186.   if (z_clip && (pos_buf[vbase] ;}      
  187.   tbase = ix_buf[ibase ] 
  188.   vbase = tbase 
  189.   poss[2].x = pos_buf[vbase ]; uv_2u = tx_buf[tbase];   
  190.   poss[2].y = pos_buf[vbase ]; uv_2v = tx_buf[tbase];   
  191.   
  192. if
  193.  (z_clip && (pos_buf[vbase] ;}  
  194.   
  195.   var vAd = [ poss[1].x - poss[0].x , poss[1].y ;   
  196.   var vBd = [ poss[2].x - poss[0].x , poss[2].. ;   
  197.   
  198.   var vCd = [ poss[2].x - poss[1].x , poss[2].y ;   
  199.   
  200.   //叉積的 z 分量  
  201.   if( (((vAd[0] * vCd[1]) - (vAd[1] * vC剔除[0]))*) ; 0)   
  202.    繼續;   
  203.   
  204.    (color_polygon) {   
  205.    g.fillStyle = uv_0u;   
  206.   
  207.    g.beginPath();   
  208.    g.moveTo(poss[0].x, poss[0].y);   
  209.    g.lineTo(poss[1].x, poss[1].y);   
  210.    g.lineTo(poss[2].x, poss[2].y);   
  211.    g.fill();   
  212.    繼續;   
  213.   }   
  214.   
  215.   var vA = [ uv_1u - uv_0u , uv_1v - uv_0u - uv_0u , uv_1v - 
  216.   
  217. var vB = [ uv_2u - uv_0u , uv_2v - uv_2u - uv_0u , uv_2v - uv_00v    
  218.   vA[0] *= w;   
  219.   vA[1] *= h;   
  220.   
  221.   vB[0] *= w;   
  222.   vB[1] *= h;   
  223.   
  224.   m._11 = vA[0];   
  225.   m._12 = vA[1];   
  226.   m._21 = vB[0];   
  227.   m._22 = vB[1];   
  228.   
  229.   
  230. var
  231.  im = m.getInvert();      
  232.  (!im) { 繼續;}}  
  233.   var a = im._11 * vAd[0]   im._12 * vBd* vAd[0]   im._12 * vBd[0];   
  234.   var b = im._21 * vAd[0]   im._22 * vBd* vAd[0]   im._22 * vBd[0];   
  235.   var c = im._11 * vAd[1]   im._12 * vBd[1];   
  236.   var d = im._21 * vAd[1]   im._22 * vBd[1];   
  237.   var wu = uv_0u * w;   
  238.   var hv = uv_0v * h;   
  239.   var du = wu * a   hv * b;   
  240.   var dv = wu * c  hv * d;   
  241.   g.save();   
  242.   g.beginPath();   
  243.   g.moveTo(poss[0].x, poss[0].y);   
  244.   g.lineTo(poss[1].x, poss[1].y);   
  245.   g.lineTo(poss[2].x, poss[2].y);   
  246.   g.clip();   
  247.   g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  248.   var bx = [wu, wu vA[0], wu vB[0]];   
  249.   var by = [hv, hv vA[1], hv vB[1]];   
  250.   bx.sort(P3D.num_cmp);   
  251.   by.sort(P3D.num_cmp);   
  252.   
  253. var bw = bx[2] - bx[0];   
  254.   var 胸集 = by[2] - by[0];   
  255.   
  256. if ((bx[0] bw) 
  257.   如果 ((by[0] 好) 
  258.   if (bx[0] >= 1) {bx[0]--; 體重;}   
  259.   如果 (by[0] >= 1) {by[0]--; 胸集 ;}   
  260.   g.drawImage(
  261. 使用.texture, bx[0], by[0], bw, bh, bx[0], by[0], 能部、電梯);   
  262. /*
  263.   if (shade_clr) {  
  264.    g.fillStyle = shade_clr;  
  265.    g.fillRect(bx[0], by[0], bw, bh);  
  266.   }  
  267. */
  268.   g.restore();   
  269. }  
  270.   
  271. }   
  272.   
  273. 函數 Vec3(_x, _y, _z)   
  274. {   
  275.  .x = _x || 0;   
  276.  .y = _y || 0;   
  277.  這個.z = _z || 0;   
  278. }   
  279.   
  280. Vec3.prototype = {   
  281.  零: 函數() {   
  282.   這個.x = 這個.z = 0;     }、  
  283.   
  284.  子: 
  285. 函數
  286. (v) {      
  287. .x -= v.x;      
  288. .y -= v.y;      
  289. .z -= v.z;      
  290.   
  291.  ;     }、  
  292.   
  293.  新增: 
  294. 函數(v) {      
  295. .x  = v.x;      
  296. .y  = v.y;      
  297. .z  = v.z;      
  298.   
  299.  ;   
  300.  }、  
  301.   
  302.  copyFrom:
  303. 函數(v) {   
  304.   
  305. .x = v.x;  
  306.   
  307. .y = v.y;   
  308.   
  309. .z = v.z;  
  310.   
  311.   
  312.  ;   
  313.  }、  
  314.   
  315.  範數:函數() {   
  316.   返回 Math.sqrt(這個.x*這個.x   這個.y*.y   這個.y   這個. *.z);   
  317.  },   
  318.   
  319.  標準化: 函數() {   
  320.   var nrm = Math.sqrt(這個.x >.x   這個.y*.y   這個.y   這個.y   這個. .z*.z);   
  321.    (nrm != 0)   
  322.   {   
  323.    .x /= nrm;   
  324.    .y /= nrm;   
  325.    .z /= nrm;   
  326.   }   
  327.    ;   
  328.  }、  
  329.   
  330.  smul: 函數
  331. (k) {   
  332.   
  333. .x *= k;   
  334.   
  335. .y *= k;   
  336.   
  337. .z *= k;   
  338.   
  339.    
  340. ;   
  341.  }、  
  342.     dpWith: 函數
  343. (v) {       .x*v.x   這個.x*v.x  >這個這個。 y*v.y   
  344. .z*v.z;   
  345.  }、  
  346.     cp: 
  347. 函數
  348. (v, w) {      
  349. 這個
  350. .x = (w.y * v.z) - (w.z * v.y);  v.z) - (w.z * v.y);  v.z) - (w.z * v.y);     這個
  351. .y = (w.z * v.x) - (w.x * v.z);  v.x) - (w.x * v.z);  v.x) - (w.x * v.z);     這個.z = (w.x * v.y) - (w.y * v.x);  v.y) - (w.y * v.x);  v.y) - (w.y * v.x);     
  352.   
  353.  ;   
  354.  }、  
  355.   
  356.  toString: 函數() {   
  357.   回來 這個.x   這個.x   .x     🎜>這個.y   ","   這個
  358. >  }   
  359. }  
  360.   
  361. 函數 M44(cpy)   
  362. {   
  363.   (cpy)   
  364.   .copyFrom(cpy);   
  365.  其他 {   
  366.   .ident();   
  367.  }   
  368. }   
  369.   
  370. M44.prototype = {   
  371.  ident: 函數() {   
  372.      這個._12 = 這個._135> >._14 = 0;      
  373. 這個
  374. ._21 =       ._24 = 0;      這個._31 = 
  375. ._34 = 0;      這個._41 = ._42 = >._43 =       0;   
  376.      ._11 = ._22 = 這個
  377. ._22 = >._33 = 
  378. ._44 = 1;          ;   
  379.  },   
  380.   
  381.  copyFrom: 函數(m) {   
  382.   ._11 = m._11;   
  383.   ._12 = m._12;   
  384.   ._13 = m._13;   
  385.   ._14 = m._14;   
  386.   
  387.   ._21 = m._21;   
  388.   ._22 = m._22;   
  389.   ._23 = m._23;   
  390.   ._24 = m._24;   
  391.   
  392.   ._31 = m._31;   
  393.   ._32 = m._32;   
  394.   ._33 = m._33;   
  395.   ._34 = m._34;   
  396.   
  397.   ._41 = m._41;   
  398.   ._42 = m._42;   
  399.   ._43 = m._43;   
  400.   ._44 = m._44;   
  401.   
  402.    ;   
  403.  }、  
  404.   
  405.  transVec3: 函數(out, x, y, z) {   
  406.   out[0] = x * ._11   y * ._11   y * 這這個
  407. ._31   這個._41;  
  408.   out[1] = x * ._12   y * 這個._32   這個._42;     out[2] = x * 
  409. 這個._13   y * 這個._33   這個._43;     out[3] = x * 
  410. ._14   y * 
  411. 這個._34   這個._44;    },   
  412.   
  413.  transVec3Rot:函數(out, x, y, z) {   
  414.   out[0] = x * ._11   y * ._11   y * 這這._31;   
  415.   out[1] = x * ._12   y * ._32;      out[2] = x * 
  416. 這個
  417. ._13   y * ._33;     }、     
  418.  視角LH:
  419. 函數(vw, vh, z_near, z_far) {   
  420.   ._11 = 2.0*z_near/vw;   
  421.   ._12 = 0;   
  422.   ._13 = 0;   
  423.   ._14 = 0;   
  424.      
  425. ._21 = 0;   
  426.   ._22 = 2*z_near/vh;   
  427.   ._23 = 0;   
  428.   ._24 = 0;   
  429.      
  430. ._31 = 0;   
  431.   ._32 = 0;   
  432.   ._33 = z_far/(z_far-z_near);   
  433.   ._34 = 1;  
  434.      
  435. ._41 = 0;   
  436.   ._42 = 0;   
  437.   ._43 = z_near*z_far/(z_near-z_far);   
  438.   
  439. ._44 = 0;   
  440.   
  441.   
  442.  
  443. ;     },   
  444.   
  445.  lookAtLH:函數(aUp, aFrom, aAt) {   
  446.   var aX = new Vec3(); 🎜>new
  447.  Vec3(); 🎠🎜
  448.   var aY = new Vec3(); 🎜>new
  449.  Vec3(); 🎠🎜
  450.   
  451.   var aZ =    aZ.sub(aFrom).normalize();   
  452.   
  453.   aX.cp(aUp, aZ).normalize();   
  454.   aY.cp(aZ, aX);   
  455.   
  456.   
  457. ._11 = aX.x;  這個._13 = aZ.x;  ._14 = 0;   ._14 = 0;   
  458.   ._21 = aX.y;  . 🎜>這個._23 = aZ.y;  ._24 = 0;   
  459. ._24 = 0;   
  460.   ._31 = aX.z;  . 🎜>這個._33 = aZ.z;  ._34 = 0;  
  461. ._34 = 0;  
  462.      
  463. ._41 = -aFrom.dpWith(aX);      
  464. ._42 = -aFrom.dpWith(aY);      
  465. ._43 = -aFrom.dpWith(aZ);      
  466. ._44 = 1;  
  467.         回來 這個
  468. ;  ;    },   
  469.   
  470.  mul: 函數(A, B) {   
  471.   ._11 = A._11*B._11     A._12*B._21 ;   
  472.   這個._12 = A._11*B._12     A._12*B._2222222    ;   
  473.   ._13 = A._11*B._13     A._ ;   
  474.   這個._14 = A._11*B._14     A._ ;   
  475.   
  476.   這個._21 = A._21*B._11     A._22*B._21  21 ;   
  477.   ._22 = A._21*B._12     A._ ;   
  478.   這個._23 = A._21*B._13     A._ ;   
  479.   這個._24 = A._21*B._14     A._ ;   
  480.   
  481.   這個._31 = A._31*B._11     A._32*B._21  3. ;   
  482.   這個._32 = A._31*B._12     A._32*B._222222  ;   
  483.   這個._33 = A._31*B._13     A._32*B._231*B._13     A._32*B._231*B._13     A._32*B._231*B._13     A._32*B._2331*B._13     A._32*B._23,321_31.A. ;   
  484.   這個._34 = A._31*B._14     A._32*B._24)14 ;   
  485.   
  486.   這個._41 = A._41*B._11     A._42*B._21  41.A. ;   
  487.   這個._42 = A._41*B._12     A._ ;   
  488.   這個._43 = A._41*B._13     A._ ;   
  489.   這個._44 = A._41*B._14     A._ ;   
  490.   
  491.    ;   
  492.  },   
  493.   
  494.  翻譯: 函數(x, y, z) {   
  495.   ._11 = 1;  . 🎜>._13 = 0;  ._14 = 0;      
  496. ._21 = 0;  ._23 = 0;  ._24 = 0;      ._31 = 0;  ._32 = 0; 🎜>
  497. ._33 = 1;  
  498. ._34 = 0;         ._41 = x;  這個._🎜>
  499. ._43 = z;  
  500. ._44 = 1;   
  501.    ;     }、  
  502.     transpose33: 函數() {   
  503.   var
  504.  t;   
  505.      t = 
  506. ._12;      這個
  507. ._12 = 
  508. ._21;     ._21 = t;   
  509.      t = ._13;   
  510.   這個._13 = 
  511. 這個._31;  
  512.   ._31 = t;   
  513.      t = ._23;   
  514.   ._23 = 
  515. ._32;     
  516. ._32 = t;      
  517.    ;   
  518.  },   
  519.   
  520.  // OpenGL style rotation   
  521.  glRotate: function(angle, x, y, z) {   
  522.   var s = Math.sin( angle );   
  523.   var c = Math.cos( angle );   
  524.   
  525.   var xx = x * x;   
  526.   var yy = y * y;   
  527.   var zz = z * z;   
  528.   var xy = x * y;   
  529.   var yz = y * z;   
  530.   var zx = z * x;   
  531.   var xs = x * s;   
  532.   var ys = y * s;   
  533.   var zs = z * s;   
  534.   var one_c = 1.0 - c;   
  535. /*  
  536.   this._11 = (one_c * xx)   c;  
  537.   this._21 = (one_c * xy) - zs;  
  538.   this._31 = (one_c * zx)   ys;  
  539.   this._41 = 0;  
  540.  
  541.   this._12 = (one_c * xy)   zs;  
  542.   this._22 = (one_c * yy)   c;  
  543.   this._32 = (one_c * yz) - xs;  
  544.   this._42 = 0;  
  545.  
  546.   this._13 = (one_c * zx) - ys;  
  547.   this._23 = (one_c * yz)   xs;  
  548.   this._33 = (one_c * zz)   c;  
  549.   this._43 = 0;  
  550.  
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
HTML與HTML5的差別
來自於 1970-01-01 08:00:00
0
0
0
symfony 2.1 的 html5 校驗
來自於 1970-01-01 08:00:00
0
0
0
能不能用html5做一個圖片滾動效果
來自於 1970-01-01 08:00:00
0
0
0
想諮詢PHP裡面怎麼寫HTML5
來自於 1970-01-01 08:00:00
0
0
0
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板