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版》
相关文章
|
存储 vr&ar 图形学
法线贴图的视线原理
使用法线贴图可以大大提高渲染效果,使低多边形数的模型看起来具有高多边形数模型的细节和真实感。在游戏开发、电影制作和虚拟现实等领域,法线贴图被广泛应用于增强场景和物体的视觉效果。
158 2
Threejs实现天空盒,全景场景,地面草地
Threejs实现天空盒,全景场景,地面草地
1271 0
Threejs实现天空盒,全景场景,地面草地
|
2月前
ThreeJs给物体添加贴图
这篇文章详细说明了在Three.js中如何给3D物体添加贴图,并展示了实现局部贴图的技术和方法。
132 1
ThreeJs给物体添加贴图
|
2月前
Threejs用切线实现模型沿着轨道行驶
这篇文章详细介绍了如何使用Three.js让一个模型沿着预定的曲线路径移动,并保持模型的方向始终沿着路径的切线方向,提供了实现这一效果的具体代码和步骤。
97 1
Threejs用切线实现模型沿着轨道行驶
|
2月前
|
人工智能 编解码 前端开发
深入了解 Three.js 中的材质与光照
Three.js 是一个强大的 JavaScript 库,用于在浏览器中创建和渲染 3D 场景。它的易用性和灵活性使得开发者能够轻松构建丰富的视觉体验。在 Three.js 中,材质与光照是影响物体外观和场景氛围的关键因素。本文将深入探讨 Three.js 中的材质类型、光源类型、光照模型,以及如何将它们结合以实现逼真的效果。
70 4
|
2月前
Cesium给物体添加贴图
这篇文章讲解了在Cesium中如何为3D模型添加贴图,并提供了具体的实现步骤和代码示例。
135 2
|
4月前
|
开发框架
threejs做特效:实现物体的发光效果-EffectComposer详解!
【8月更文挑战第7天】实现物体的发光效果-EffectComposer详解!
518 6
threejs做特效:实现物体的发光效果-EffectComposer详解!
|
4月前
|
机器学习/深度学习
第5章-着色基础-5.2-光源
第5章-着色基础-5.2-光源
30 0
|
C++ 计算机视觉 Python
C++ VS OpenGL绘制教室三维立体旋转图像
C++ VS OpenGL绘制教室三维立体旋转图像
166 0
C++ VS OpenGL绘制教室三维立体旋转图像
|
编解码 图形学 容器
3D模型如何添加表面贴图?
通过模型表面贴图技术,可以实现各种效果,如木纹、石纹、金属反射、布料纹理等,从而使模型更加生动、具有细节和丰富的外观。
166 0