多视角3D逼真HTML5水波动画


Posted in HTML / CSS onMarch 03, 2016

这是一款基于HTML5的3D水波动画特效,它的效果非常逼真,我们可以按“G”键来让水池中的石头上下浮动,按“L”键添加灯光效果,设计相当完美。同时说明一下,这款3D水波动画是基于WebGL渲染技术的,大家可以了解一下WebGL。

多视角3D逼真HTML5水波动画

在线预览 源码下载

HTML代码

XML/HTML Code复制内容到剪贴板
  1. <img id="tiles" src="tiles.jpg">  
  2. <img id="xneg" src="xneg.jpg">  
  3. <img id="xpos" src="xpos.jpg">  
  4. <img id="ypos" src="ypos.jpg">  
  5. <img id="zneg" src="zneg.jpg">  
  6. <img id="zpos" src="zpos.jpg">  
  7.   

JavaScript代码

JavaScript Code复制内容到剪贴板
  1. function Water() {   
  2.   var vertexShader = '\  
  3.     varying vec2 coord;\  
  4.     void main() {\  
  5.       coord = gl_Vertex.xy * 0.5 + 0.5;\  
  6.       gl_Position = vec4(gl_Vertex.xyz, 1.0);\  
  7.     }\  
  8.   ';   
  9.   this.plane = GL.Mesh.plane();   
  10.   if (!GL.Texture.canUseFloatingPointTextures()) {   
  11.     throw new Error('This demo requires the OES_texture_float extension');   
  12.   }   
  13.   var filter = GL.Texture.canUseFloatingPointLinearFiltering() ? gl.LINEAR : gl.NEAREST;   
  14.   this.textureA = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter });   
  15.   this.textureB = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter });   
  16.   this.dropShader = new GL.Shader(vertexShader, '\  
  17.     const float PI = 3.141592653589793;\  
  18.     uniform sampler2D texture;\  
  19.     uniform vec2 center;\  
  20.     uniform float radius;\  
  21.     uniform float strength;\  
  22.     varying vec2 coord;\  
  23.     void main() {\  
  24.       /* get vertex info */\  
  25.       vec4 info = texture2D(texture, coord);\  
  26.       \  
  27.       /* add the drop to the height */\  
  28.       float drop = max(0.0, 1.0 - length(center * 0.5 + 0.5 - coord) / radius);\  
  29.       drop = 0.5 - cos(drop * PI) * 0.5;\  
  30.       info.r += drop * strength;\  
  31.       \  
  32.       gl_FragColor = info;\  
  33.     }\  
  34.   ');   
  35.   this.updateShader = new GL.Shader(vertexShader, '\  
  36.     uniform sampler2D texture;\  
  37.     uniform vec2 delta;\  
  38.     varying vec2 coord;\  
  39.     void main() {\  
  40.       /* get vertex info */\  
  41.       vec4 info = texture2D(texture, coord);\  
  42.       \  
  43.       /* calculate average neighbor height */\  
  44.       vec2 dx = vec2(delta.x, 0.0);\  
  45.       vec2 dy = vec2(0.0, delta.y);\  
  46.       float average = (\  
  47.         texture2D(texture, coord - dx).r +\  
  48.         texture2D(texture, coord - dy).r +\  
  49.         texture2D(texture, coord + dx).r +\  
  50.         texture2D(texture, coord + dy).r\  
  51.       ) * 0.25;\  
  52.       \  
  53.       /* change the velocity to move toward the average */\  
  54.       info.g += (average - info.r) * 2.0;\  
  55.       \  
  56.       /* attenuate the velocity a little so waves do not last forever */\  
  57.       info.g *= 0.995;\  
  58.       \  
  59.       /* move the vertex along the velocity */\  
  60.       info.r += info.g;\  
  61.       \  
  62.       gl_FragColor = info;\  
  63.     }\  
  64.   ');   
  65.   this.normalShader = new GL.Shader(vertexShader, '\  
  66.     uniform sampler2D texture;\  
  67.     uniform vec2 delta;\  
  68.     varying vec2 coord;\  
  69.     void main() {\  
  70.       /* get vertex info */\  
  71.       vec4 info = texture2D(texture, coord);\  
  72.       \  
  73.       /* update the normal */\  
  74.       vec3 dx = vec3(delta.x, texture2D(texture, vec2(coord.x + delta.x, coord.y)).r - info.r, 0.0);\  
  75.       vec3 dy = vec3(0.0, texture2D(texture, vec2(coord.x, coord.y + delta.y)).r - info.r, delta.y);\  
  76.       info.ba = normalize(cross(dy, dx)).xz;\  
  77.       \  
  78.       gl_FragColor = info;\  
  79.     }\  
  80.   ');   
  81.   this.sphereShader = new GL.Shader(vertexShader, '\  
  82.     uniform sampler2D texture;\  
  83.     uniform vec3 oldCenter;\  
  84.     uniform vec3 newCenter;\  
  85.     uniform float radius;\  
  86.     varying vec2 coord;\  
  87.     \  
  88.     float volumeInSphere(vec3 center) {\  
  89.       vec3 toCenter = vec3(coord.x * 2.0 - 1.0, 0.0, coord.y * 2.0 - 1.0) - center;\  
  90.       float t = length(toCenter) / radius;\  
  91.       float dy = exp(-pow(t * 1.5, 6.0));\  
  92.       float ymin = min(0.0, center.y - dy);\  
  93.       float ymax = min(max(0.0, center.y + dy), ymin + 2.0 * dy);\  
  94.       return (ymax - ymin) * 0.1;\  
  95.     }\  
  96.     \  
  97.     void main() {\  
  98.       /* get vertex info */\  
  99.       vec4 info = texture2D(texture, coord);\  
  100.       \  
  101.       /* add the old volume */\  
  102.       info.r += volumeInSphere(oldCenter);\  
  103.       \  
  104.       /* subtract the new volume */\  
  105.       info.r -= volumeInSphere(newCenter);\  
  106.       \  
  107.       gl_FragColor = info;\  
  108.     }\  
  109.   ');   
  110. }   
  111.   
  112. Water.prototype.addDrop = function(x, y, radius, strength) {   
  113.   var this_ = this;   
  114.   this.textureB.drawTo(function() {   
  115.     this_.textureA.bind();   
  116.     this_.dropShader.uniforms({   
  117.       center: [x, y],   
  118.       radius: radius,   
  119.       strength: strength   
  120.     }).draw(this_.plane);   
  121.   });   
  122.   this.textureB.swapWith(this.textureA);   
  123. };   
  124.   
  125. Water.prototype.moveSphere = function(oldCenter, newCenter, radius) {   
  126.   var this_ = this;   
  127.   this.textureB.drawTo(function() {   
  128.     this_.textureA.bind();   
  129.     this_.sphereShader.uniforms({   
  130.       oldCenter: oldCenter,   
  131.       newCenter: newCenter,   
  132.       radius: radius   
  133.     }).draw(this_.plane);   
  134.   });   
  135.   this.textureB.swapWith(this.textureA);   
  136. };   
  137.   
  138. Water.prototype.stepSimulation = function() {   
  139.   var this_ = this;   
  140.   this.textureB.drawTo(function() {   
  141.     this_.textureA.bind();   
  142.     this_.updateShader.uniforms({   
  143.       delta: [1 / this_.textureA.width, 1 / this_.textureA.height]   
  144.     }).draw(this_.plane);   
  145.   });   
  146.   this.textureB.swapWith(this.textureA);   
  147. };   
  148.   
  149. Water.prototype.updateNormals = function() {   
  150.   var this_ = this;   
  151.   this.textureB.drawTo(function() {   
  152.     this_.textureA.bind();   
  153.     this_.normalShader.uniforms({   
  154.       delta: [1 / this_.textureA.width, 1 / this_.textureA.height]   
  155.     }).draw(this_.plane);   
  156.   });   
  157.   this.textureB.swapWith(this.textureA);   
  158. };   

以上就是本文的全部内容,希望对大家的学习有所帮助。

HTML / CSS 相关文章推荐
纯CSS3制作的简洁蓝白风格的登录模板(非IE效果更好)
Aug 11 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
Feb 29 HTML / CSS
css3动画效果小结(推荐)
Jul 25 HTML / CSS
浅谈CSS3中的变形功能-transform功能
Dec 27 HTML / CSS
CSS3实现缺角矩形,折角矩形以及缺角边框
Dec 20 HTML / CSS
CSS3 中filter(滤镜)属性使用详解
Apr 07 HTML / CSS
IE9下html5初试小刀
Sep 21 HTML / CSS
HTML5事件方法全部汇总
May 12 HTML / CSS
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
Jan 10 HTML / CSS
HTML+CSS+JavaScript实现图片3D展览的示例代码
Oct 12 HTML / CSS
HTML怎么设置下划线?html文字加下划线方法
Dec 06 HTML / CSS
CSS三大特性继承性、层叠性和优先级详解
Jan 18 HTML / CSS
HTML5的新特性(1)
Mar 03 #HTML / CSS
HTML5 Canvas实现烟花绽放特效
Mar 02 #HTML / CSS
多视角3D可旋转的HTML5 Logo动画
Mar 02 #HTML / CSS
探索HTML5本地存储功能运用技巧
Mar 02 #HTML / CSS
谈一谈HTML5本地存储技术
Mar 02 #HTML / CSS
逼真的HTML5树叶飘落动画
Mar 01 #HTML / CSS
HTML5+CSS3绘制锯齿状的矩形
Mar 01 #HTML / CSS
You might like
fleaphp crud操作之find函数的使用方法
2011/04/23 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
Yii入门教程之Yii安装及hello world
2014/11/25 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
jQuery Ajax方法调用 Asp.Net WebService 的详细实例代码
2011/04/27 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
javascript中eval解析JSON字符串
2016/02/27 Javascript
Vue.js 2.0窥探之Virtual DOM到底是什么?
2017/02/10 Javascript
jQuery插件FusionWidgets实现的Bulb图效果示例【附demo源码下载】
2017/03/23 jQuery
基于Vue实现timepicker
2017/04/25 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
vue router 通过路由来实现切换头部标题功能
2019/04/24 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
关于在LayUI中使用AJAX提交巨坑记录
2019/10/25 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
[03:04]DOTA2英雄基础教程 影魔
2013/12/11 DOTA
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python 计算文件的md5值实例
2017/01/13 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
解决django 向mysql中写入中文字符出错的问题
2020/05/18 Python
浅谈Python协程
2020/06/17 Python
文职个人求职信范文
2013/09/23 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
售房协议书范本
2015/08/11 职场文书
七年级数学教学反思
2016/02/17 职场文书
七年级之家长会发言稿范文
2019/09/04 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript
详解如何使用Nginx解决跨域问题
2022/05/06 Servers