webgl图形变换、投影与摄像机

简介: 入坑webgl,从图形变换、投影与摄像机开始,基操学得好,以后才能怎么炫酷怎么来~快快快,点进来~~

1.webgl图形变换

(1)2D 旋转

//计算2D旋转矩阵
function createRotateMatrix(angle=0.0) {
   
   
  var radian = degToRad(angle);
  var cosB = Math.cos(radian),
    sinB = Math.sin(radian);
  return flatArr([
    [cosB, sinB, 0.0, 0.0],
    [-sinB, cosB, 0.0, 0.0],
    [0.0, 0.0, 1.0, 0.0],
    [0.0, 0.0, 0.0, 1.0]
  ]);
}

20230507\_152621.gif

(2)3D旋转

var settings = {
   
   
          x: 1,
          y: 1,
          z: 1
        };
          var modelViewMatrix = mat4.create();         
          mat4.rotateX(modelViewMatrix, modelViewMatrix, settings.x);
          mat4.rotateY(modelViewMatrix, modelViewMatrix, settings.y);
          mat4.rotateZ(modelViewMatrix, modelViewMatrix, settings.z);

20230507\_153431.gif

(3)缩放

 function createScaleMatrix(sx=1.0, sy=1.0,sz=1.0) {
   
   
          return flatArr([
            [sx, 0, 0.0, 0.0],
            [0, sy, 0.0, 0.0],
            [0.0, 0.0, sz, 0.0],
            [0.0, 0.0, 0.0, 1.0]
          ]);
        }

  //同理
    var modelViewMatrix = mat4.create();    
  mat4.scale(modelViewMatrix, modelViewMatrix, [settings.scaleX, settings.scaleY, settings.scaleZ]);

20230507\_154627.gif

20230507\_155635.gif

(4)平移

  • 顶点着色器
//vec3 aMovePos;平移的位置
vec3 pos=aPosition+aMovePos;
 gl_Position =vec4(pos,1.0);

20230507\_161121.gif

  • 平移矩阵
 var modelViewMatrix = mat4.create();    
  mat4.translate(modelViewMatrix, modelViewMatrix, [settings.x, settings.y, settings.z]);

20230507\_161517.gif

2.wegl投影与摄像机

(1)正交投影:一个前后左右上下四个面形成的长方体空间,物体在里面才能显示,超过就不显示,不添加投影矩阵的情况下,默认是[-1.0,1.0]的立方体

 function orthographic(left, right, bottom, top, near, far) {
   
   
    return flatArr([
      [2 / (right - left), 0, 0, 0],
      [0, 2 / (top - bottom), 0, 0],
      [0, 0, 2 / (near - far), 0],

      [(left + right) / (left - right),
      (bottom + top) / (bottom - top),
      (near + far) / (near - far),
      1],
    ]);
}

var depth = Math.max(gl.canvas.width, gl.canvas.height);
  var left = -gl.canvas.width * 0.01;
  var right = gl.canvas.width * 0.01;
  var bottom = gl.canvas.height * 0.01;
  var top = -gl.canvas.height * 0.01;
  var near = depth * 0.1;
  var far = -depth * 0.1;
  var projectionMatrix = new Float32Array(orthographic(left, right, bottom, top, near, far));
  • 注意:空间越大,物体就会显得越小,甚至看不到,空间设置要适当

  • glMatrix正交投影

 var projectionMatrix = mat4.create();
 mat4.ortho(projectionMatrix, left, right, bottom, top, near, far);

(2)透视投影:类似小孔成像,从一个点触发,放射出四棱锥,近点和远点分别切一个面,截取的这个范围内,物体就可以看到,其他就不能看见

function perspective(fieldOfViewInRadians, aspect, near, far) {
   
   
  var f = Math.tan(Math.PI * 0.5 - 0.5 * fieldOfViewInRadians);
  var rangeInv = 1.0 / (near - far);

  return flatArr([
    [f / aspect, 0, 0, 0],
    [0, f, 0, 0],
    [0, 0, (near + far) * rangeInv, -1],
    [0, 0, near * far * rangeInv * 2, 0]
  ]);
}
  • glMatrix透视投影
    var projectionMatrix = mat4.create();

     mat4.perspective(projectionMatrix, fieldOfView, aspect, zNear, zFar);

(3)摄像机:一句话就是你的眼睛,你的眼睛等同于一个透视投影,眼睛会移动位置,然后就会呈现不同的视图

 var cameraMatrix = mat4.create();
//lookAt(out, eye, center, up)
mat4.lookAt(cameraMatrix, [settings.x, settings.y, settings.z], [0, 0, 0], [0, 1, 0]);

20230507\_202839.gif

3.Github地址

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

4.需要使用到的库

  • glMatrix 官方 API 文档:https://glmatrix.net/docs/module-mat4.html
  • dat.gui 官方 API 文档:https://github.com/dataarts/dat.gui/blob/master/API.md

参考

  • https://webglfundamentals.org/
  • 《WebGL编程指南》
  • 《webGL 3D开发实战详解 第2版》
相关文章
nuxt3:vue-dompurify-html
nuxt3:vue-dompurify-html
671 0
|
开发工具 git
IDEA中如何使用Git 图文超详细
IDEA中Git使用,实战教程
9447 1
IDEA中如何使用Git 图文超详细
|
算法 图形学
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
【计算机图形学】实验四 二维图形的缩放、旋转,平移,组合变换
821 2
|
12月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
641 58
|
10月前
|
人工智能 自然语言处理 API
UI-TARS:字节跳动开源专注于多平台 GUI 自动化交互的视觉语言模型
UI-TARS 是字节跳动推出的新一代原生图形用户界面(GUI)代理模型,支持跨平台自动化交互,具备强大的感知、推理、行动和记忆能力,能够通过自然语言指令完成复杂任务。
2561 16
UI-TARS:字节跳动开源专注于多平台 GUI 自动化交互的视觉语言模型
|
人工智能 搜索推荐 前端开发
seo如何优化
木头左,物联网工程师,分享AI工具。本文探讨SEO优化,包括理解基本概念,关键词研究,内容、外部链接和技术优化。关键词研究注重长尾词和竞争度;内容优化要求高质量、结构清晰、定期更新;外部链接要来自高权重源,自然且多样;技术优化涉及URL结构、网站速度、移动友好性和安全性等。记得点赞、收藏和关注哦!
seo如何优化
Vue3走马灯(Carousel)
这是一个基于 Vue2 的走马灯(Carousel)组件,支持丰富的自定义配置。主要属性包括图片数组、宽度、高度、自动切换、暂停轮播、过渡效果、轮播间隔、箭头和指示点等。组件提供了多种过渡效果(如滑动和渐变)及动画时长设置,并允许自定义箭头和指示点的样式。此外,还支持通过键盘方向键进行切换,提供了灵活的使用方法。
629 3
Vue3走马灯(Carousel)
|
安全 搜索推荐 vr&ar
脑机接口:人类认知与技术的深度融合
【9月更文挑战第13天】脑机接口(BMI)技术正快速发展,成为连接人类认知与高科技领域的桥梁。本文从定义、原理、应用及挑战等方面全面探讨了这一前沿技术。脑机接口通过测量大脑活动,转化为外部设备的控制信号,已在疾病治疗、运动功能恢复、认知改善及AR/VR等领域展现巨大潜力。然而,技术难度、伦理安全及成本问题仍需克服。未来,随着技术进步,脑机接口有望更广泛地应用于日常生活,引领科技新方向。
|
Ubuntu 开发工具 git
rk3588 镜像构建环境搭建基于docker
构建镜像环境搭建过程
944 1
|
移动开发 前端开发 数据处理
探索前端性能优化的新思路:使用Web Workers提升网页响应速度
传统的前端性能优化方法已经不能完全满足日益增长的网页需求。本文提出了一种新的思路,即利用Web Workers技术来提升网页的响应速度。通过将耗时的计算任务交给Web Workers处理,可以避免主线程阻塞,从而提高网页的用户体验。本文将介绍Web Workers的基本原理、使用方法以及在前端性能优化中的应用实例,帮助开发者更好地理解和运用这一技术。