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版》
相关文章
|
8月前
|
存储 vr&ar 图形学
法线贴图的视线原理
使用法线贴图可以大大提高渲染效果,使低多边形数的模型看起来具有高多边形数模型的细节和真实感。在游戏开发、电影制作和虚拟现实等领域,法线贴图被广泛应用于增强场景和物体的视觉效果。
107 2
|
7月前
|
编解码 图形学 容器
3D模型如何添加表面贴图?
通过模型表面贴图技术,可以实现各种效果,如木纹、石纹、金属反射、布料纹理等,从而使模型更加生动、具有细节和丰富的外观。
86 0
|
8月前
|
C++ 计算机视觉 Python
C++ VS OpenGL绘制教室三维立体旋转图像
C++ VS OpenGL绘制教室三维立体旋转图像
78 0
C++ VS OpenGL绘制教室三维立体旋转图像
|
11月前
|
API
webgl图形变换、投影与摄像机
入坑webgl,从图形变换、投影与摄像机开始,基操学得好,以后才能怎么炫酷怎么来~快快快,点进来~~
webgl图形变换、投影与摄像机
|
11月前
【Three.js入门】标准网格材质、置换贴图、粗糙度贴图、金属贴图、法线贴图
【Three.js入门】标准网格材质、置换贴图、粗糙度贴图、金属贴图、法线贴图
298 0
四元数与三维旋转
四元数与三维旋转
113 0
四元数与三维旋转
|
数据可视化
第3讲 三维空间刚体运动
第3讲 三维空间刚体运动
第3讲 三维空间刚体运动
Threejs使用LOD根据摄像机距离物体的距离显示不同的物体
Threejs使用LOD根据摄像机距离物体的距离显示不同的物体
565 0
Threejs使用LOD根据摄像机距离物体的距离显示不同的物体
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
962 0
Threejs实现镜头跟随物体移动效果,镜头拐弯并保持运动方向
|
API
使用Threejs创建几何体并添加材质、光源、阴影、动画,添加坐标轴
使用Threejs创建几何体并添加材质、光源、阴影、动画,添加坐标轴
403 0
使用Threejs创建几何体并添加材质、光源、阴影、动画,添加坐标轴