WebGL雾和物体旋转

简介: WebGL雾和物体旋转

1.雾

1)片元着色器

 precision mediump float;
            #define LOG2 1.442695
      uniform vec3 uFogColor;//雾颜色
      uniform float uFogDensity;//雾强度
      varying  vec3 vColor;
      varying vec4 vPosition;
      void main() {

        float fogDistance = length(vPosition.xyz );
        // exp2雾
        float fogAmount = 1.0- exp2(-uFogDensity * uFogDensity * fogDistance * fogDistance * LOG2);
        fogAmount = clamp(fogAmount, 0.0, 1.0);

        gl_FragColor = mix(vec4(vColor,1.0), vec4(uFogColor,1.0), fogAmount);
      }

2) 初始化赋值

 //雾颜色
 gl.uniform3f(gl.getUniformLocation(program, 'uFogColor'), 0.1, 0.2, 0.4);
 //雾强度
  gl.uniform1f(gl.getUniformLocation(program, 'uFogDensity'), 0.2);

20230519\_204840.gif

可以看到雾的效果近看能看清,远看变模糊。

2.旋转物体

1)监听canvas动作


 function initEvent(gl) {
   
   
          var rotateAngle = {
   
   
            x: 0, //绕y轴旋转角度
            y: 0 //绕x轴旋转角度
          };

          var incAngle = -0.01; //旋转角度步长值,鼠标旋转灵敏度

          var lastClickX, lastClickY; //上次触控点X,Y坐标
          var ismoved = false; //是否移动标志位
          //鼠标按下的监听
          document.onmousedown = function (event) {
   
   
            var x = event.clientX;
            var y = event.clientY;
           //如果鼠标在canvas里开始移动
            var rect = (event.target || event.srcElement).getBoundingClientRect();
            if (rect.left <= x && x < rect.right && rect.top <= y && y < rect.bottom) {
   
   
              ismoved = true;
              lastClickX = x;
              lastClickY = y;
            }
          };
          //鼠标抬起的监听
          document.onmouseup = function (event) {
   
   
            ismoved = false;
          };
          //鼠标移动时的监听
          document.onmousemove = function (event) {
   
   
            var x = event.clientX,
              y = event.clientY;
            if (ismoved) {
   
   
              rotateAngle.y = rotateAngle.y + (x - lastClickX) * incAngle;
              rotateAngle.x = rotateAngle.x + (y - lastClickY) * incAngle;
            }
            lastClickX = x;
            lastClickY = y;
          };
          return rotateAngle;
        }

2)赋值旋转角度到变换矩阵

   var rotateAngle = initEvent(gl);
   var modelViewMatrix = mat4.create();          
          mat4.rotateX(modelViewMatrix, modelViewMatrix, rotateAngle.x);
          mat4.rotateY(modelViewMatrix, modelViewMatrix, rotateAngle.y);
          gl.uniformMatrix4fv(
            gl.getUniformLocation(gl.program, 'uModelViewMatrix'),
            false,
            modelViewMatrix
 );

20230611\_152920.gif

Github地址

https://github.com/xiaolidan00/my-webgl

参考

  • https://webglfundamentals.org/
  • 《WebGL编程指南》
  • 《webGL 3D开发实战详解 第2版》
相关文章
|
3月前
|
缓存 Cloud Native 算法
《云原生架构下的智能物流调度系统故障排查与优化》
本文围绕某智能物流调度系统在云原生架构下的故障排查与优化展开。该系统基于Kubernetes、Istio等构建,业务扩张后高峰时段频发订单提交失败、调度信息延迟等问题。经分层排查,发现根源在于应用层连接池配置不合理、服务网格路由与负载均衡策略缺陷、资源调度及云边通信瓶颈等多层级协同失效。通过应用层优化连接池与算法拆分、服务网格重构路由规则与提升同步效率、资源层动态调整配置与扩容、云边协同增强自治能力等措施,系统性能与业务指标显著改善。
109 0
|
8月前
|
安全 数据安全/隐私保护 Windows
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
394 15
如何在Windows 10系统中查看已连接WiFi密码-亲测可用-优雅草卓伊凡
|
Web App开发 移动开发 HTML5
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码
html5 + Three.js 3D风雪封印在棱镜中的梅花鹿动效源码。画面中心是悬浮于空的梅花鹿,其四周由白色线段组成了一个6边形将中心的梅花鹿包裹其中。四周漂浮的白雪随着多边形的转动而同步旋转。建议使用支持HTML5与css3效果较好的火狐(Firefox)或谷歌(Chrome)等浏览器预览本源码。
252 2
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
754 1
Threejs用切线实现模型沿着轨道行驶
|
11月前
|
Web App开发 前端开发 JavaScript
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
2015年,JavaScript之父Brendan Eich再次创业,推出Brave浏览器和加密货币Basic Attention Token(BAT),旨在颠覆传统广告行业。Brave屏蔽广告、保护隐私,加载速度快;BAT则通过奖励机制让用户、内容创作者和广告主三方受益。尽管面临用户习惯和巨头竞争的挑战,Brave已拥有超4000万月活跃用户,成为全球增长最快的隐私浏览器,引领Web3生态发展。
391 22
折腾之王:JavaScript之父Brave浏览器与BAT的诞生
|
存储 缓存 应用服务中间件
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
2354 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
Axure 多平台自适应
Axure 多平台自适应
336 0
|
存储 API 数据安全/隐私保护
邮箱收不到验证码邮件是什么原因
在互联网应用中,未收到验证码邮件常令人困扰。原因包括:邮件误标为垃圾、邮箱设置不当、发件服务器故障、邮箱地址输入错误,及ISP拦截。解决策略有检查垃圾邮件、清理邮箱、修正设置、确认邮箱地址无误、联系服务提供商与ISP,或尝试其他邮箱服务。使用AOKSend等可靠邮件服务可提升送达率,其优势在于高送达率、实时监测与易集成性,确保验证码邮件及时准确到达,改善用户体验。
|
编解码 计算机视觉 C++
FFmpeg 的使用与Docker安装流媒体服务器
FFmpeg 的使用与Docker安装流媒体服务器
1210 0