ホームページ  >  記事  >  ウェブフロントエンド  >  HTML5 3D 服スイングアニメーション特殊効果_html5 チュートリアル スキル

HTML5 3D 服スイングアニメーション特殊効果_html5 チュートリアル スキル

WBOY
WBOYオリジナル
2016-05-16 15:45:421983ブラウズ

これも HTML5 キャンバスに基づいた 3D アニメーションの傑作です。風になびく 3D の服のスイング アニメーションの特殊効果で、非常にリアルです。服の上でマウスをスライドさせると、服が揺れるアニメーションが表示されます。マウスをクリックすると、服がさらに激しく揺れます。

オンラインデモ ソースコードのダウンロード

HTML コード

XML/HTML コードコンテンツをクリップボードにコピー
  1. <div style="width:500px;margin :10px 自動">
  2. <キャンバス id="cv" ="480" 高さ="300">キャンバス>
  3. <p>「2D キャンバス上の 3D」デモ< /p>
  4. <p>カーソルを移動してパン/クリックしてスイング< ;/p>
  5. div>

P3D ライブラリ JS コード。主に 3D 効果の処理に使用されます

JavaScript コードコンテンツをクリップボードにコピーします
  1. window.P3D = {
  2. テクスチャ: null
  3. g: null
  4. };   
  5. P3D.clear = 関数(f, w, h) {
  6. var g = this.g;   
  7. g.beginPath();   
  8. g.fillStyle = f;   
  9. g.fillRect(0, 0, w, h);   
  10. }
  11. P3D.num_cmp = 関数(a,b){return a-b;}  
  12. P3D.drawTriangle = 関数(poss, uvs, shade_clr) {
  13. var w = this.texture.width;   
  14. var h = this.texture.height;   
  15. var g = this.g;   
  16. var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;   
  17. var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;   
  18. var vA = [ uvs[1].u - uvs[0].u , uvs[1].v - uvs[0].v ] ;   
  19. var vB = [ uvs[2].u - uvs[0].u , uvs[2].v - uvs[0].v ] ;   
  20. vA[0] *= w;   
  21. vA[1] *= h;   
  22. vB[0] *= w;   
  23. vB[1] *= h;   
  24. var m = new M22();   
  25. m._11 = vA[0];   
  26. m._12 = vA[1];   
  27. m._21 = vB[0];   
  28. m._22 = vB[1];   
  29. var im = m.getInvert();   
  30. if (!im) return false;   
  31. var a = im._11 * vAd[0] im._12 * vBd[0];   
  32. var b = im._21 * vAd[0] im._22 * vBd[0];   
  33. var c = im._11 * vAd[1] im._12 * vBd[1];   
  34. var d = im._21 * vAd[1] im._22 * vBd[1];   
  35. var wu = uvs[0].u * w;   
  36. var hv = uvs[0].v * h;   
  37. var du = wu * a hv * b;   
  38. var dv = wu * c hv * d;   
  39. g.save();   
  40. g.beginPath();   
  41. g.moveTo(poss[0].x, poss[0].y);   
  42. g.lineTo(poss[1].x, poss[1].y);   
  43. g.lineTo(poss[2].x, poss[2].y);   
  44. g.clip();   
  45. g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  46. // 境界
  47. var bx = [wu, wu vA[0], wu vB[0]];   
  48. var by = [hv, hv vA[1], hv vB[1]];   
  49. bx.sort(P3D.num_cmp);   
  50. by.sort(P3D.num_cmp);   
  51. var bw = bx[2] - bx[0];   
  52. var bh = by[2] - by[0];   
  53. if ((bx[0] bw)
  54. if ((by[0] bh) <= (h-1)) bh ;   
  55. if (bx[0] >= 1) {bx[0]--; bw;}
  56. if (by[0] >= 1) {by[0]--; bh ;}
  57. g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw、bh);   
  58. if (shade_clr) {
  59. g.fillStyle = shade_clr;   
  60. g.fillRect(bx[0], by[0], bw, bh);   
  61. }
  62. g.restore();   
  63. return true;   
  64. }
  65. P3D.drawTestByIndexBuffer = 関数(pos_buf, ix_buf, culling) {
  66. var g = this.g;   
  67. if ((ix_buf.length%3) != 0)
  68. throw 「インデックスバッファの長さが無効です!」;   
  69. var len = ix_buf.length/3;   
  70. var i, ibase, vbase;   
  71. var poss = [{},{},{}];   
  72. g.ストローク幅 = 1;   
  73. for (i = 0, ibase = 0;i < len; i)
  74. {
  75. vbase = ix_buf[ibase ] << 2;   
  76. poss[0].x = pos_buf[vbase ];   
  77. poss[0].y = pos_buf[vbase ];   
  78. vbase = ix_buf[ibase ] << 2;   
  79. poss[1].x = pos_buf[vbase ];   
  80. poss[1].y = pos_buf[vbase ];   
  81. vbase = ix_buf[ibase ] << 2;   
  82. poss[2].x = pos_buf[vbase ];   
  83. poss[2].y = pos_buf[vbase ];   
  84. // クロス積の z コンポーネント 0?
  85. var Ax = poss[1].x - poss[0].x;   
  86. var Ay = poss[1].y - poss[0].y;   
  87. var Cx = poss[2].x - poss[1].x;   
  88. var Cy = poss[2].y - poss[1].y;   
  89. var cull = ((((Ax * Cy) - (Ay * Cx))*culling) < 0);   
  90. g.beginPath();   
  91. g.ストロークスタイル = カリング ? "#592" : "#0f0";   
  92. g.moveTo(poss[0].x, poss[0].y);   
  93. g.lineTo(poss[1].x, poss[1].y);   
  94. g.lineTo(poss[2].x, poss[2].y);   
  95. g.lineTo(poss[0].x, poss[0].y);   
  96. g.ストローク();   
  97. }
  98. }
  99. P3D.drawByIndexBuffer = 関数(pos_buf, ix_buf, tx_buf, culling, z_clip) {
  100. var w, h;   
  101. var color_polygon = !this.texture;   
  102. if (this.texture) {
  103. w = this.texture.width;   
  104. h = this.texture.height;   
  105. <🎜> }  
  106. var g = this.g;   
  107. var m = new M22();   
  108. if (!カリング) カリング = 0;   
  109. if ((ix_buf.length%3) != 0)
  110. throw 「インデックスバッファの長さが無効です!」;   
  111. var i, ibase, vbase, tbase, poss = [{},{},{}];   
  112. var len = ix_buf.length/3;   
  113. var uv_0u, uv_0v, uv_1u, uv_1v, uv_2u, uv_2v;   
  114. for (i = 0, ibase = 0;i < len; i)
  115. {
  116. tbase = ix_buf[ibase ] << 1
  117. vbase = tbase << 1;   
  118. poss[0].x = pos_buf[vbase ]; uv_0u = tx_buf[tbase ];   
  119. poss[0].y = pos_buf[vbase ]; uv_0v = tx_buf[tbase];   
  120. if (z_clip &&(pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {ibase = 2; 続行;}
  121. tbase = ix_buf[ibase ] << 1
  122. vbase = tbase << 1;   
  123. poss[1].x = pos_buf[vbase ]; uv_1u = tx_buf[tbase ];   
  124. poss[1].y = pos_buf[vbase ]; uv_1v = tx_buf[tbase];   
  125. if (z_clip &&(pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) { ibase; 続行;}
  126. tbase = ix_buf[ibase ] << 1
  127. vbase = tbase << 1;   
  128. poss[2].x = pos_buf[vbase ]; uv_2u = tx_buf[tbase ];   
  129. poss[2].y = pos_buf[vbase ]; uv_2v = tx_buf[tbase];   
  130. if (z_clip && (pos_buf[vbase] < 0 || pos_buf[vbase] > 1)) {続き;}  
  131. var vAd = [ poss[1].x - poss[0].x , poss[1].y - poss[0].y ] ;   
  132. var vBd = [ poss[2].x - poss[0].x , poss[2].y - poss[0].y ] ;   
  133. var vCd = [ poss[2].x - poss[1].x , poss[2].y - poss[1].y ] ;   
  134. // クロス積の z コンポーネント 0?
  135. if((((vAd[0] * vCd[1]) - (vAd[1] * vCd[0]))*カリング) < ; 0)
  136. 続行;   
  137. if (color_polygon) {
  138. g.fillStyle = uv_0u;   
  139. g.beginPath();   
  140. g.moveTo(poss[0].x, poss[0].y);   
  141. g.lineTo(poss[1].x, poss[1].y);   
  142. g.lineTo(poss[2].x, poss[2].y);   
  143. g.fill();   
  144. 続行;   
  145. }
  146. var vA = [ uv_1u - uv_0u , uv_1v - uv_0v ];   
  147. var vB = [ uv_2u - uv_0u , uv_2v - uv_0v ];   
  148. vA[0] *= w;   
  149. vA[1] *= h;   
  150. vB[0] *= w;   
  151. vB[1] *= h;   
  152. m._11 = vA[0];   
  153. m._12 = vA[1];   
  154. m._21 = vB[0];   
  155. m._22 = vB[1];   
  156. var im = m.getInvert();   
  157. if (!im) { 続行;}  
  158. var a = im._11 * vAd[0] im._12 * vBd[0];   
  159. var b = im._21 * vAd[0] im._22 * vBd[0];   
  160. var c = im._11 * vAd[1] im._12 * vBd[1];   
  161. var d = im._21 * vAd[1] im._22 * vBd[1];   
  162. var wu = uv_0u * w;   
  163. var hv = uv_0v * h;   
  164. var du = wu * a hv * b;   
  165. var dv = wu * c hv * d;   
  166. g.save();   
  167. g.beginPath();   
  168. g.moveTo(poss[0].x, poss[0].y);   
  169. g.lineTo(poss[1].x, poss[1].y);   
  170. g.lineTo(poss[2].x, poss[2].y);   
  171. g.clip();   
  172. g.transform(a, c, b, d, poss[0].x - du, poss[0].y - dv);   
  173. // 境界
  174. var bx = [wu, wu vA[0], wu vB[0]];   
  175. var by = [hv, hv vA[1], hv vB[1]];   
  176. bx.sort(P3D.num_cmp);   
  177. by.sort(P3D.num_cmp);   
  178. var bw = bx[2] - bx[0];   
  179. var ブラジャー = by[2] - by[0];   
  180. if ((bx[0] bw) <= (w-1)) bw ;   
  181. if ((by[0] bra) <= (h-1)) bra ;   
  182. if (bx[0] >= 1) {bx[0]--; bw;}
  183. if (by[0] >= 1) {by[0]--; ブラ ;}
  184. g.drawImage(this.texture, bx[0], by[0], bw, bh, bx[0], by[0], bw、ブラ);   
  185. /*
  186. if (shade_clr) {
  187. g.fillStyle = shade_clr;
  188. g.fillRect(bx[0], by[0], bw, bh);
  189. }
  190. */
  191. g.restore();   
  192. }  
  193. }
  194. 関数 Vec3(_x, _y, _z)
  195. {
  196. これ.x = _x || 0;   
  197. これ.y = _y || 0;   
  198. これ.z = _z || 0;   
  199. }
  200. Vec3.prototype = {
  201. ゼロ: 関数() {
  202. これ.x = これ.y = これ.z = 0;   
  203. }、
  204. sub: 関数(v) {
  205. これ.x -= v.x;   
  206. これ.y -= v.y;   
  207. これ.z -= v.z;   
  208. 返却 これ;   
  209. }、
  210. 追加: 関数(v) {
  211. これ.x = v.x;   
  212. これ.y = v.y;   
  213. これ.z = v.z;   
  214. 返却 これ;   
  215. }、
  216. copyFrom: 関数(v) {
  217. これ.x = v.x;   
  218. これ.y = v.y;   
  219. これ.z = v.z;   
  220. 返却 これ;   
  221. }、
  222. ノルム:関数() {
  223. return Math.sqrt(this.x*this.x これ.y*これ.y これ.z *これ.z);   
  224. },
  225. 正規化: 関数() {
  226. var nrm = Math.sqrt(this.x*this.x これ.y*これ.y これ .z*これ.z);   
  227. if (nrm != 0)
  228. {
  229. これ.x /= nrm;   
  230. これ.y /= nrm;   
  231. これ.z /= nrm;   
  232. }
  233. 返却 これ;   
  234. }、
  235. smul: 関数(k) {
  236. これ.x *= k;   
  237. これ.y *= k;   
  238. これ.z *= k;   
  239. 返却 これ;   
  240. }、
  241. dpWith: 関数(v) {
  242. return this.x*v.x this。 y*v.y これ.z*v.z;   
  243. }、
  244. cp: 関数(v, w) {
  245. これ.x = (w.y * v.z) - (w.z * v.y);   
  246. これ.y = (w.z * v.x) - (w.x * v.z);   
  247. これ.z = (w.x * v.y) - (w.y * v.x);   
  248. 返却 これ;   
  249. }、
  250. toString: function() {
  251. return this.x ", " これ.y "," これ.z;   
  252. }
  253. }  
  254. 関数 M44(cpy)
  255. {
  256. if (cpy)
  257. this.copyFrom(cpy);   
  258. else {
  259. this.ident();   
  260. }
  261. }
  262. M44.prototype = {
  263. ident: 関数() {
  264. これ._12 = これ._13 = これ._14 = 0;   
  265. これ._21 = これ._23 = これ._24 = 0;   
  266. これ._31 = これ._32 = これ._34 = 0;   
  267. これ._41 = これ._42 = これ._43 = 0;   
  268. これ._11 = これ._22 = これ._33 = これ._44 = 1;   
  269. 返却 これ;   
  270. },
  271. copyFrom: 関数(m) {
  272. これ._11 = m._11;   
  273. これ._12 = m._12;   
  274. これ._13 = m._13;   
  275. これ._14 = m._14;   
  276. これ._21 = m._21;   
  277. これ._22 = m._22;   
  278. これ._23 = m._23;   
  279. これ._24 = m._24;   
  280. これ._31 = m._31;   
  281. これ._32 = m._32;   
  282. これ._33 = m._33;   
  283. これ._34 = m._34;   
  284. これ._41 = m._41;   
  285. これ._42 = m._42;   
  286. これ._43 = m._43;   
  287. これ._44 = m._44;   
  288. 返却 これ;   
  289. }、
  290. transVec3: 関数(out, x, y, z) {
  291. out[0] = x * これ._11 y * これ._21 z * これ._31 これ._41;   
  292. out[1] = x * これ._12 y * これ._22 z * これ._32 これ._42;   
  293. out[2] = x * これ._13 y * これ._23 z * これ._33 これ._43;   
  294. out[3] = x * これ._14 y * これ._24 z * これ._34 これ._44;   
  295. },
  296. transVec3Rot: 関数(out, x, y, z) {
  297. out[0] = x * これ._11 y * これ._21 z * これ._31;   
  298. out[1] = x * これ._12 y * これ._22 z * これ._32;   
  299. out[2] = x * これ._13 y * これ._23 z * これ._33;   
  300. }、
  301. perspectiveLH: 関数(vw, vh, z_near, z_far) {
  302. これ._11 = 2.0*z_near/vw;   
  303. これ._12 = 0;   
  304. これ._13 = 0;   
  305. これ._14 = 0;   
  306. これ._21 = 0;   
  307. これ._22 = 2*z_near/vh;   
  308. これ._23 = 0;   
  309. これ._24 = 0;   
  310. これ._31 = 0;   
  311. これ._32 = 0;   
  312. これ._33 = z_far/(z_far-z_near);   
  313. これ._34 = 1;   
  314. これ._41 = 0;   
  315. これ._42 = 0;   
  316. これ._43 = z_near*z_far/(z_near-z_far);   
  317. これ._44 = 0;   
  318. 返却 これ;   
  319. },
  320. lookAtLH: 関数(aUp, aFrom, aAt) {
  321. var aX = new Vec3();   
  322. var aY = new Vec3();   
  323. var aZ = new Vec3(aAt.x, aAt.y, aAt.z);   
  324. aZ.sub(aFrom).normalize();   
  325. aX.cp(aUp, aZ).normalize();   
  326. aY.cp(aZ, aX);   
  327. これ._11 = aX.x;  これ._12 = aY.x;  これ._13 = aZ.x;  これ._14 = 0;   
  328. これ._21 = aX.y;  これ._22 = aY.y;  これ._23 = aZ.y;  これ._24 = 0;   
  329. これ._31 = aX.z;  これ._32 = aY.z;  これ._33 = aZ.z;  これ._34 = 0;   
  330. これ._41 = -aFrom.dpWith(aX);   
  331. これ._42 = -aFrom.dpWith(aY);   
  332. これ._43 = -aFrom.dpWith(aZ);   
  333. これ._44 = 1;   
  334. 戻る これ;   
  335. },
  336. mul: 関数(A, B) {
  337. これ._11 = A._11*B._11 A._12*B._21 A._13*B._31 A._14*B._41 ;   
  338. これ._12 = A._11*B._12 A._12*B._22 A._13*B._32 A._14*B._42 ;   
  339. これ._13 = A._11*B._13 A._12*B._23 A._13*B._33 A._14*B._43 ;   
  340. これ._14 = A._11*B._14 A._12*B._24 A._13*B._34 A._14*B._44 ;   
  341. これ._21 = A._21*B._11 A._22*B._21 A._23*B._31 A._24*B._41 ;   
  342. これ._22 = A._21*B._12 A._22*B._22 A._23*B._32 A._24*B._42 ;   
  343. これ._23 = A._21*B._13 A._22*B._23 A._23*B._33 A._24*B._43 ;   
  344. これ._24 = A._21*B._14 A._22*B._24 A._23*B._34 A._24*B._44 ;   
  345. これ._31 = A._31*B._11 A._32*B._21 A._33*B._31 A._34*B._41 ;   
  346. これ._32 = A._31*B._12 A._32*B._22 A._33*B._32 A._34*B._42 ;   
  347. これ._33 = A._31*B._13 A._32*B._23 A._33*B._33 A._34*B._43 ;   
  348. これ._34 = A._31*B._14 A._32*B._24 A._33*B._34 A._34*B._44 ;   
  349. これ._41 = A._41*B._11 A._42*B._21 A._43*B._31 A._44*B._41 ;   
  350. これ._42 = A._41*B._12 A._42*B._22 A._43*B._32 A._44*B._42 ;   
  351. これ._43 = A._41*B._13 A._42*B._23 A._43*B._33 A._44*B._43 ;   
  352. これ._44 = A._41*B._14 A._42*B._24 A._43*B._34 A._44*B._44 ;   
  353. 返却 これ;   
  354. },
  355. translate: 関数(x, y, z) {
  356. これ._11 = 1;  これ._12 = 0;  これ._13 = 0;  これ._14 = 0;   
  357. これ._21 = 0;  これ._22 = 1;  これ._23 = 0;  これ._24 = 0;   
  358. これ._31 = 0;  これ._32 = 0;  これ._33 = 1;  これ._34 = 0;   
  359. これ._41 = x;  これ._42 = y;  これ._43 = z;  これ._44 = 1;   
  360. 返却 これ;   
  361. }、
  362. transpose33: 関数() {
  363. var t;   
  364. t = これ._12;   
  365. これ._12 = これ._21;   
  366. これ._21 = t;   
  367. t = これ._13;   
  368. これ._13 = これ._31;   
  369. これ._31 = t;   
  370. t = これ._23;   
  371. これ._23 = これ._32;   
  372. これ._32 = t;   
  373. 返却 これ;   
  374. },   
  375.   
  376.  //OpenGL 風格旋轉   
  377.  gl旋轉: 函數(角, x, y, z) {   
  378.   var s = Math.sin( 角度 );   
  379.   var c = Math.cos( 角度 );   
  380.   
  381.   var xx = x * x;   
  382.   var yy = y * y;   
  383.   var zz = z * z;   
  384.   var xy = x * y;   
  385.   var yz = y * z;   
  386.   var zx = z * x;   
  387.   var xs = x * s;   
  388.   var ys = y * s;   
  389.   var zs = z * s;   
  390.   var one_c = 1.0 - c;   
  391. /*  
  392.   這個._11 = (one_c * xx)   c;  
  393.   this._21 = (one_c * xy) - zs;  
  394.   this._31 = (one_c * zx)   ys;  
  395.   這._41 = 0;  
  396.  
  397.   this._12 = (one_c * xy)   zs;  
  398.   this._22 = (one_c * yy)   c;  
  399.   this._32 = (one_c * yz) - xs;  
  400.   這._42 = 0;  
  401.  
  402.   this._13 = (one_c * zx) - ys;  
  403.   this._23 = (one_c * yz)   xs;  
  404.   this._33 = (one_c * zz)   c;  
  405.   這._43 = 0;  
  406.  
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。