如何制作多视角3D逼真HTML5水波动画
发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,如何制作多视角3D逼真HTML5水波动画 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这是一款基于HTML5的3D水波动画特效,它
千家信息网最后更新 2025年01月21日如何制作多视角3D逼真HTML5水波动画
如何制作多视角3D逼真HTML5水波动画 ,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
这是一款基于HTML5的3D水波动画特效,它的效果非常逼真,我们可以按"G"键来让水池中的石头上下浮动,按"L"键添加灯光效果,设计相当完美。同时说明一下,这款3D水波动画是基于WebGL渲染技术的,大家可以了解一下WebGL。
HTML代码
XML/HTML Code复制内容到剪贴板
JavaScript代码
JavaScript Code复制内容到剪贴板
function Water() { var vertexShader = '\ varying vec2 coord;\ void main() {\ coord = gl_Vertex.xy * 0.5 + 0.5;\ gl_Position = vec4(gl_Vertex.xyz, 1.0);\ }\ '; this.plane = GL.Mesh.plane(); if (!GL.Texture.canUseFloatingPointTextures()) { throw new Error('This demo requires the OES_texture_float extension'); } var filter = GL.Texture.canUseFloatingPointLinearFiltering() ? gl.LINEAR : gl.NEAREST; this.textureA = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter }); this.textureB = new GL.Texture(256, 256, { type: gl.FLOAT, filter: filter }); this.dropShader = new GL.Shader(vertexShader, '\ const float PI = 3.141592653589793;\ uniform sampler2D texture;\ uniform vec2 center;\ uniform float radius;\ uniform float strength;\ varying vec2 coord;\ void main() {\ /* get vertex info */\ vec4 info = texture2D(texture, coord);\ \ /* add the drop to the height */\ float drop = max(0.0, 1.0 - length(center * 0.5 + 0.5 - coord) / radius);\ drop = 0.5 - cos(drop * PI) * 0.5;\ info.r += drop * strength;\ \ gl_FragColor = info;\ }\ '); this.updateShader = new GL.Shader(vertexShader, '\ uniform sampler2D texture;\ uniform vec2 delta;\ varying vec2 coord;\ void main() {\ /* get vertex info */\ vec4 info = texture2D(texture, coord);\ \ /* calculate average neighbor height */\ vec2 dx = vec2(delta.x, 0.0);\ vec2 dy = vec2(0.0, delta.y);\ float average = (\ texture2D(texture, coord - dx).r +\ texture2D(texture, coord - dy).r +\ texture2D(texture, coord + dx).r +\ texture2D(texture, coord + dy).r\ ) * 0.25;\ \ /* change the velocity to move toward the average */\ info.g += (average - info.r) * 2.0;\ \ /* attenuate the velocity a little so waves do not last forever */\ info.g *= 0.995;\ \ /* move the vertex along the velocity */\ info.r += info.g;\ \ gl_FragColor = info;\ }\ '); this.normalShader = new GL.Shader(vertexShader, '\ uniform sampler2D texture;\ uniform vec2 delta;\ varying vec2 coord;\ void main() {\ /* get vertex info */\ vec4 info = texture2D(texture, coord);\ \ /* update the normal */\ vec3 dx = vec3(delta.x, texture2D(texture, vec2(coord.x + delta.x, coord.y)).r - info.r, 0.0);\ vec3 dy = vec3(0.0, texture2D(texture, vec2(coord.x, coord.y + delta.y)).r - info.r, delta.y);\ info.ba = normalize(cross(dy, dx)).xz;\ \ gl_FragColor = info;\ }\ '); this.sphereShader = new GL.Shader(vertexShader, '\ uniform sampler2D texture;\ uniform vec3 oldCenter;\ uniform vec3 newCenter;\ uniform float radius;\ varying vec2 coord;\ \ float volumeInSphere(vec3 center) {\ vec3 toCenter = vec3(coord.x * 2.0 - 1.0, 0.0, coord.y * 2.0 - 1.0) - center;\ float t = length(toCenter) / radius;\ float dy = exp(-pow(t * 1.5, 6.0));\ float ymin = min(0.0, center.y - dy);\ float ymax = min(max(0.0, center.y + dy), ymin + 2.0 * dy);\ return (ymax - ymin) * 0.1;\ }\ \ void main() {\ /* get vertex info */\ vec4 info = texture2D(texture, coord);\ \ /* add the old volume */\ info.r += volumeInSphere(oldCenter);\ \ /* subtract the new volume */\ info.r -= volumeInSphere(newCenter);\ \ gl_FragColor = info;\ }\ '); } Water.prototype.addDrop = function(x, y, radius, strength) { var this_ = this; this.textureB.drawTo(function() { this_.textureA.bind(); this_.dropShader.uniforms({ center: [x, y], radius: radius, strength: strength }).draw(this_.plane); }); this.textureB.swapWith(this.textureA); }; Water.prototype.moveSphere = function(oldCenter, newCenter, radius) { var this_ = this; this.textureB.drawTo(function() { this_.textureA.bind(); this_.sphereShader.uniforms({ oldCenter: oldCenter, newCenter: newCenter, radius: radius }).draw(this_.plane); }); this.textureB.swapWith(this.textureA); }; Water.prototype.stepSimulation = function() { var this_ = this; this.textureB.drawTo(function() { this_.textureA.bind(); this_.updateShader.uniforms({ delta: [1 / this_.textureA.width, 1 / this_.textureA.height] }).draw(this_.plane); }); this.textureB.swapWith(this.textureA); }; Water.prototype.updateNormals = function() { var this_ = this; this.textureB.drawTo(function() { this_.textureA.bind(); this_.normalShader.uniforms({ delta: [1 / this_.textureA.width, 1 / this_.textureA.height] }).draw(this_.plane); }); this.textureB.swapWith(this.textureA); };
关于如何制作多视角3D逼真HTML5水波动画 问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
动画
水波
逼真
内容
问题
视角
制作
代码
剪贴板
效果
更多
剪贴
帮助
解答
易行
简单易行
上下
同时
小伙
小伙伴
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库应用基础李红
企业网络安全解决文案
软件开发有了什么变化
越入服务器
web应用软件开发 公司
北京环境监测软件开发哪家好
数据库安全审计系统审计内容
数据库转redis
靠谱的网络安全服务哪里有
朋友网服务器
网络安全属于 范畴
笔电bios软件开发
华为服务器v5安装系统教程
柳州市app软件开发报价
计算机软件开发质量评定表
数据库程序设计知识点
oracle数据库备份还原
数据库审计的安全策略
计算机网络技术有关的就业
你的地理数据库是什么意思
天津网络技术研究所 怎么样
合肥参考网络技术咨询怎么样
医保局需要网络技术的人才吗
青岛柚音互联网科技
计算数据库中均值
临沂民主评议软件开发公司
有关网络技术的企业
学习软件开发的专业
oracle数据库备份还原
微信外卖预订软件开发