当前位置: 首页 > news >正文

webgl入门实例-10正交投影基本概念

WebGL 正交投影

正交投影(Orthographic Projection)是WebGL中常用的一种投影方式,它保持物体的平行线在投影后仍然平行,不会产生透视效果(近大远小)。

正交投影基础

正交投影的特点是:

  • 保持物体的实际尺寸不变
  • 平行线在投影后仍保持平行
  • 没有透视缩短效果

在WebGL中实现正交投影

1. 使用矩阵库

通常我们会使用矩阵库(如gl-matrix)来创建正交投影矩阵:

import { mat4 } from 'gl-matrix';// 创建正交投影矩阵
const projectionMatrix = mat4.create();
mat4.ortho(projectionMatrix, left, right, bottom, top, near, far);

2. 手动创建正交投影矩阵

也可以手动创建正交投影矩阵:

function createOrthographicMatrix(left, right, bottom, top, near, far) {const dst = new Float32Array(16);dst[0] = 2 / (right - left);dst[1] = 0;dst[2] = 0;dst[3] = 0;dst[4] = 0;dst[5] = 2 / (top - bottom);dst[6] = 0;dst[7] = 0;dst[8] = 0;dst[9] = 0;dst[10] = -2 / (far - near);dst[11] = 0;dst[12] = -(right + left) / (right - left);dst[13] = -(top + bottom) / (top - bottom);dst[14] = -(far + near) / (far - near);dst[15] = 1;return dst;
}

3. 在着色器中使用

顶点着色器中应用正交投影矩阵:

attribute vec4 a_position;
uniform mat4 u_projection;
uniform mat4 u_modelView;void main() {gl_Position = u_projection * u_modelView * a_position;
}

正交投影参数解释

mat4.ortho或手动创建函数接受6个参数:

  • left - 左裁剪面
  • right - 右裁剪面
  • bottom - 下裁剪面
  • top - 上裁剪面
  • near - 近裁剪面
  • far - 远裁剪面

这些参数定义了一个立方体裁剪空间,所有在这个空间内的物体都会被渲染。

示例使用

// 设置正交投影
const projectionMatrix = mat4.create();
// 创建一个从-400到400宽,-300到300高,-1到1深的投影空间
mat4.ortho(projectionMatrix, -400, 400, -300, 300, -1, 1);// 在渲染循环中
gl.uniformMatrix4fv(uProjectionLocation, false, projectionMatrix);

正交投影 vs 透视投影

特性正交投影透视投影
平行线保持平行会聚于消失点
尺寸保持相同随距离减小
用途CAD、2D游戏、UI3D游戏、真实场景

调整正交投影

可以根据画布大小动态调整正交投影:

function updateProjectionMatrix(gl) {const aspect = gl.canvas.clientWidth / gl.canvas.clientHeight;const width = 800;  // 你希望的世界单位宽度const height = width / aspect;mat4.ortho(projectionMatrix, -width/2, width/2, -height/2, height/2, -1, 1);
}

正交投影非常适合2D渲染、UI元素或需要保持物体实际尺寸不变的3D应用。

相关文章:

  • C++ AVL树
  • 自学C语言——指针详解(一)
  • 网站制作公司哪家好?如何选择靠谱的网站设计公司
  • 卷积神经网络(CNN)与VGG16在图像识别中的实验设计与思路
  • 工商业光伏发电自发自用余电不上网?“防逆流装置”怎么选?
  • 在msys2里面编译antlr4的过程记录
  • 《软件设计师》复习笔记(12.1)——范围管理、进度管理
  • 美信监控易告警:功能强大
  • 深度学习总结(21)
  • device_fingerprint、device_id、hmac生成
  • 2d深度预测
  • MQ基础篇
  • 深度学习3.1 线性回归
  • 前端基础之《Vue(6)—组件基础(2)》
  • 1.Linux基础指令
  • MATLAB 控制系统设计与仿真 - 37
  • Linux:命令行参数、环境变量
  • [经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
  • 大数据赋能,全面提升‘企业服务平台’实际效能!
  • 浏览器的存储机制 - Storage
  • 广西出现今年首场超警洪水
  • 一周人物| 萨韦利上海画展,陆永安“从董源到塞尚”
  • 北京理工大学解除宫某聘用关系,该教师被指涉嫌骚扰猥亵学生
  • 五一假期出行预订进入高潮:酒店搜索热度翻倍,“请4休11”拼假带动长线游
  • 青创上海—2025浦东徒步行活动举行,“青年草坪创新创业湃对”正式亮相
  • 新消费观察 | 重点深耕,外资科技企业继续看好中国发展