首頁  >  文章  >  web前端  >  多視角3D逼真HTML5水波動畫 _html5教學技巧

多視角3D逼真HTML5水波動畫 _html5教學技巧

WBOY
WBOY原創
2016-05-16 15:45:382053瀏覽

這是一款基於HTML5的3D水波動畫特效,它的效果非常逼真,我們可以按「G」鍵來讓水池中的石頭上下浮動,按「L」鍵添加燈光效果,設計相當完美。同時說明一下,這款3D水波動畫是基於WebGL渲染技術的,大家可以了解WebGL。

線上預覽 原始碼下載

HTML程式碼

XML/HTML Code複製內容到剪貼簿
  1. img id=id=id=id=id=
  2. ; 🎜> src="tiles.jpg"> 🎜>> > img 
  3. id
  4. =id=id=id src="xneg.jpg">
  5. img id=id=id=" 🎜> src="xpos.jpg">
  6. > img id=id=id=" 🎜> 
  7. src
  8. ="ypos.jpg">> img id=id
  9. =
  10. id
  11. =
id

=

id
=id
=id src="zneg.jpg"> img id=id=id=" 🎜> src="zpos.jpg">    JavaScript程式碼 JavaScript Code複製內容到剪貼簿
  1. 函數 水() {   
  2.   var vertexShader = '  
  3.     變化的 vec2 座標;  
  4.     void main() {  
  5.       座標 = gl_Vertex.xy * 0.5   0.5;  
  6.       gl_Position = vec4(gl_Vertex.xyz, 1.0);  
  7.     }  
  8.   ';   
  9.   .plane = GL.Mesh.plane();   
  10.   if (!GL.Texture.canUseFloatingPointTextures()) {   
  11.     拋出  >);      }   
  12.   
  13. var filter = GL.Texture.canUseFloatingPointLinearFiltering() ? gl.線性:gl.最近;   這個
  14. .textureA =  GL.Texture(256,Texture(256,I56,過濾器:過濾器});      這個
  15. .textureB = 
  16.  GL.Texture(256,Texture(256,I56,過濾器:過濾器});   
  17.   這個.dropShader =  GL.Shader((Shader), cp > 
  18.     const float PI = 3.141592653589793;
  19.  
  20.     統一取樣器二維紋理;
  21.  
  22.     均勻 vec2 中心;
  23.  
  24.     統一浮動半徑;
  25.  
  26.     均勻的漂浮強度;
  27.  
  28.     變化的 vec2 座標;
  29.  
  30.     void main() {
  31.  
  32.       /* 取得頂點資訊*/
  33.  
  34.       vec4 info = texture2D(紋理, 座標);
  35.  
  36.       
  37.  
  38.       /* 將水滴加到高度*/
  39.  
  40.       浮點數 = max(0.0, 1.0 - 長度(中心 * 0.5 0.5 - 座標)/半徑);
  41.  
  42.       drop = 0.5 - cos(drop * PI) * 0.5;
  43.  
  44.       info.r  = 掉落 * 肌力;
  45.  
  46.       
  47.  
  48.       gl_FragColor = 資訊;
  49.  
  50.     } 
  51.   ');   
  52.   這個.updateShader =  GL.Shader( > 
  53.     統一取樣器二維紋理;
  54.  
  55.     統一 vec2 delta;
  56.  
  57.     變化的 vec2 座標;
  58.  
  59.     void main() {
  60.  
  61.       /* 取得頂點資訊*/
  62.  
  63.       vec4 info = texture2D(紋理, 座標);
  64.  
  65.       
  66.  
  67.       /* 計算鄰居平均身高*/
  68.  
  69.       vec2 dx = vec2(delta.x, 0.0);
  70.  
  71.       vec2 dy = vec2(0.0, delta.y);
  72.  
  73.       浮動平均值= (
  74.  
  75.         texture2D(紋理, 座標 - dx).r 
  76.  
  77.         texture2D(紋理, 座標 - dy).r 
  78.  
  79.         texture2D(紋理, 座標   dx).r 
  80.  
  81.         texture2D(紋理, 座標   dy).r
  82.  
  83.       ) * 0.25;
  84.  
  85.       
  86.  
  87.       /* 改變速率以朝向平均值移動*/
  88.  
  89.       info.g  = (平均值 - info.r) * 2.0;
  90.  
  91.       
  92.  
  93.       /*稍微減弱速度,因此波浪不會永遠持續*/
  94.  
  95.       info.g *= 0.995;
  96.  
  97.       
  98.  
  99.       /* 沿速度移動頂點*/
  100.  
  101.       info.r  = info.g;
  102.  
  103.       
  104.  
  105.       gl_FragColor = 資訊;
  106.  
  107.     } 
  108.   ');   
  109.   這個.normalShader =  GL.Shader((Shader) > 
  110.     統一取樣器二維紋理;
  111.  
  112.     統一 vec2 delta;
  113.  
  114.     變化的 vec2 座標;
  115.  
  116.     void main() {
  117.  
  118.       /* 取得頂點資訊*/
  119.  
  120.       vec4 info = texture2D(紋理, 座標);
  121.  
  122.       
  123.  
  124.       /* 更新正常*/
  125.  
  126.       vec3 dx = vec3(delta.x, texture2D(texture, vec2(coord.x dx delta.x, coord.y)).info 🎜>
  127.       vec3 dy = vec3(0.0, texture2D(texture, vec2(coord.x, coord.y texture2D(texture, vec2(coord.x, coord.y ),
  128.       info.ba = 歸一化(cross(dy, dx)).xz;  
  129.         
  130.       gl_FragColor = 資訊;  
  131.     }  
  132.   ');   
  133.   這個.sphereShader = 
  134.  GL.Shader(vert( >      統一取樣器二維紋理;       統一 vec3 oldCenter;
  135.  
  136.     uniform vec3 newCenter;
  137.  
  138.     統一浮動半徑;
  139.  
  140.     變化的 vec2 座標;
  141.  
  142.     
  143.  
  144.     float volumeInSphere(vec3 center) {
  145.  
  146.       vec3 toCenter = vec3(coord.x * 2.0 - 1.0, 0.0, coord.y * 2.0 - 1.0) - center;
  147.  
  148.       float t = 長度(至中心)/ 半徑;
  149.  
  150.       float dy = exp(-pow(t * 1.5, 6.0));
  151.  
  152.       float ymin = min(0.0, center.y - dy);
  153.  
  154.       float ymax = min(max(0.0, center.y  dy), ymin  2.0 *作用
  155.       返回(ymax - ymin)* 0.1;  
  156.     } 
  157.       
  158.     void main() {  
  159.       /* 取得頂點資訊*/  
  160.       vec4 info = texture2D(紋理, 座標);  
  161.         
  162.       /* 新增舊卷*/  
  163.       info.r  = volumeInSphere(oldCenter);  
  164.         
  165.       /* 減去新卷*/  
  166.       info.r -= volumeInSphere(newCenter);  
  167.         
  168.       gl_FragColor = 資訊;  
  169.     }  
  170.   ');   
  171. }   
  172.   
  173. Water.prototype.addDrop = 函數(x, y, 半徑, 強度) {   
  174.   var 這個_ = 這個; 🎜>這個
  175. ; 🎠  這個.textureB.drawTo(函數
  176. ().
  177.     this_.textureA.bind();   
  178.     this_.dropShader.uniforms({   
  179.       中心:[x, y],   
  180.       半徑:半徑,  
  181.       強度: 強度   
  182.     }).draw(this_.plane);   
  183.   });   
  184.   這個.textureB.swapWith(這個.textureA);  
  185. };   
  186.   
  187. Water.prototype.moveSphere = 
  188. 函數(oldCenter, newCenter, 半徑) {   
  189.   var 這個_ = 這個; 🎜>這個
  190. ; 🎠
  191.   這個.textureB.drawTo(函數().
  192.     this_.textureA.bind();   
  193.     this_.sphereShader.uniforms({   
  194.       oldCenter:oldCenter,  
  195.       新中心:新中心,  
  196.       半徑:半徑   
  197.     }).draw(this_.plane);   
  198.   });   
  199.   這個.textureB.swapWith(這個.textureA);   };   
  200.   
  201. Water.prototype.stepSimulation = 函數() {   
  202.   var 這個_ = 這個; 🎜>這個
  203. ; 🎠  這個.textureB.drawTo(函數
  204. ().
  205.     this_.textureA.bind();   
  206.     this_.updateShader.uniforms({   
  207.       增量:[1 / this_.textureA.width, 1 / this_.textureA.height]   
  208.     }).draw(this_.plane);   
  209.   });   
  210.   這個.textureB.swapWith(這個.textureA);  
  211. };   
  212.   
  213. Water.prototype.updateNormals = 
  214. 函數() {   
  215.   
  216. var 這個_ = 這個; 🎜>這個; 🎠
  217.   這個.textureB.drawTo(函數().     this_.textureA.bind();   
  218.     this_.normalShader.uniforms({   
  219.       增量:[1 / this_.textureA.width, 1 / this_.textureA.height]   
  220.     }).draw(this_.plane);   
  221.   });   
  222.   
  223. 這個.textureB.swapWith(這個.textureA);   };   
  224. 以上就是本文的全部內容,希望對大家的學習有所幫助。
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn