OpenGL笔记之矩阵变换(Matrix Transformation)

2023-10-29

分类: OpenGL 2012-08-06 21:21  3968人阅读  评论(1)  收藏  举报

本文是学习OpenGL过程中的一篇笔记。在学习过程中,主要参照了大名鼎鼎的

  • 《OpenGL Programming Guide》(中文名《OpenGL编程指南》,有些人还称之为OpenGL红宝书)
  • 《OpenGL SuperBible》(中文名《OpenGL超级宝典》,有些人还称之为OpenGL蓝宝书)

另外还有

  • 《3D Computer Graphics: A Mathematical Introduction with OpenGL》
  • 《Advanced Graphics Programming Using OpenGL Morgan Kaufmann Series in Computer Graphics and Geometric Modeling 》
  • 《3D Math Primer for graphics and game development》

等书籍。


1,应用程序传送给OpenGL的顶点位置坐标法线向量坐标纹理坐标以及光源坐标都是定义在对象坐标系中的。如果应用程序开启了基于对象坐标系的纹理生成,那么这些纹理坐标的生成是利用末经模型视图矩阵变换的顶点位置坐标生成的,所以这种情况下如果移动或者旋转物体,纹理将和物体一起移动或者旋转,实例请参考蓝宝书第9章的TEXGEN程序。

The vertices of a model are typically stored in object space, a coordinate system that is local to the particular model and used only by that model. The position and orientation of each model are often stored inworld space, a global coordinate system that ties all of the object spaces together. Before  an object can be rendered, its vertices must be transformed into  camera space (also called  eye space), the space in which the x and y axes are aligned to the display and the z axis is parallel to the viewing direction. 

2,模型转换(Modeling Transformation):使用模型转换的目的是设置物体在场景中的位置(position)和方向(orientation)。通常,为了正确的在场景中放置每个物体,每个物体都需要一个不同的模型转换。如果要使物体产生运动效果,也需要在每帧更新时对物体使用不同的模型转换。

3,视觉转换(Viewing Transformation):使用视觉转换的目的是改变场景中所有物体的位置和方向,换句话说,就是改变观察的位置和方向。实例请参见下图:


视觉转换需要的信息是viewer’s (eye) position, the center of observation, and the normal (“vector” quantity) to the viewer’s head (as indicated by the orange arrow over the Blender camera in Figures。

4,使用glLight命令给定光源位置和方向时,在光源位置和方向被OpenGL存储之前会经过模型视图矩阵(ModelView Matrix)的变换。如果没有用glLight命令更新的话,这些位置和方向将一直被OpenGL在计算光照时使用。

5,在视觉坐标系中,物体光照效果发生作用,基于视觉坐标系的纹理坐标生成也是发生在视觉坐标系中的。默认情况下,视点(或者说成照相机)位于视觉坐标系原点,指向Z轴负方向,向上向量为(0,1,0),请参见下图。


由于视觉坐标系指向Z轴负方向,所以glFrustum(GLdouble left,GLdouble  right,GLdouble bottom,GLdouble  top,GLdouble  near,GLdouble  far)和gluPerspective(GLdouble fovy,GLdoubleaspect,GLdoublenear,GLdoublefar)中的near和far是在以Z轴负方向的情况下指定的。

可以直接使用gluLookAt来改变视点的位置和方向。注意,在OpenGL代码中,视觉转换一定要发生在模型转换之前,可以在绘图之前的任何时刻进行投影变换和视口变换。

如果使能光照的话,openGL会在视觉坐标系中使用视点位置光源位置法线向量来进行光照计算,从而修改物体顶点的颜色。为了便于理解,这里引用一个光照模型图,如下:


6,投影变换(Project Transformation):投影变换的一个显著特征是透视缩短,即物体如果离照相机的距离越远,则它看上去就越小。透视投影可以看成一个金字塔的平截头体。靠近观察点的物体看上去会更大一些,因为和远处的物体相比,他们占据了视景体中相对较大的区域。

投影变换其实是对对象进行变形处理,使得变形后的对象经正交投影后得到与原对象的理想投影后一样的视图(详细请参见:投影矩阵深入探索透视投影变换)。

       “透视”一词源自拉丁文“perspclre”,意为看透。为了将立体物体的图像转化到平面上以完成作画的过程,人们开始了关于透视的研究。最初研究透视是采取通过一块透明的平面去看景物的方法,将所见景物准确描画在这块平面上,即成该景物的透视图。随着研究的深入,人们将在平面画幅上根据一定原理,用线条来显示物体的空间位置、轮廓和投影的科学称为透视学。
       在多种透视方法中,最常用到的是线透法。线透法的基本原理,在于将物体的每一个点全部以连线的方式与观察视野,也就是我们的眼睛相连,然后再将一块平面置于这些线上,由线穿透平面所构成的投影来确定物体在画面中的形态。无论是现代西方美术、摄影还是图形渲染工业,一切与现代西方美术有关并以平面化展现立体物体形象为任务的领域,都要依赖线透法来实现最终的画面效果。

透视投影在图形学中非常重要,因为它是人类视觉系统的模型。为便于理解,我们以小孔成像来说明它的基本原理。请参见下图:

图中右边的茶壶经过小孔投影到左边的立方体中。其剖面图如下:

为了计算上的方便,我们将投影平面移到投影的前面,如下图:

这就是OpenGL使用的投影原理。

我们可以用glFrustum建立投影视景体,如下图:

此时,投影后所形成的最终图像将会显示在near平面上。投影矩阵的推导过程请参见《OpenGL Projection Matrix》。

注意:投影变换变换后的坐标系是右手坐标系,即点(0,0,1)比点(0,0,-1)距离观察者近。

7,透视除法(Perspective Division):通过透视除法,我们可以得到NDC(Normalized Device Coordinate)。规范化的原因是不想为每种类型的投影设计不同的投影矩阵,所以把所有的投影转换为具有默认视景体的正交投影。

通过投影变换和透视除法,我们得到NDC。这个过程可能难于理解,下面我们用计算机图形学中的一点透视来解释一下(详细请参见《》)。我们考虑从NDC到视景体的变换,步骤如下:

设:视点(投影中心)在Z轴上(z=-d),投影面在XOY上,一点透视的步骤:

平移三维形体到(lmn

确定d的值,透视变换

XOY作正投影变换

8,Normalized Device Coordinate System (NDCS) is the coordinate system in which the entire screen of the device corresponds to a unit cube, so all points in this cube are within the range [1, 1, 1] to [-1, -1, -1] for x, y, and z。


注意:NDC坐标系是左手坐标系,即点(0,0,-1)比点(0,0,1)距离观察者近。

可以通过在启用深度测试(GL_DEPTH_TEST)后,使用glDepthRangef(1, 0) 来将左手坐标系变成右手坐标系。

9,窗口变换矩阵(Viewport Transformation):在NDC视景体中的每一个点(x,y,z),其x,y,z取值范围都在区间[-1,1]内。它的x和y坐标映射到一个以(Vx,Vy)为起点,宽为w,高为h,中心点为(Vx+w/2, Vy+y/2)的窗口(Viewport)中。z坐标默认映射到范围[0,1]中,也可改变它,使它映射到[Dn,Df]中,这样深度范围d=Df-Dn,并且它的中心点是(Dn+Df)/2。这样,实现从NDC到窗口坐标转换的窗口变换矩阵是:

下面是2张效果示例图:


10,关于红宝书中3.2节视图和模型转换中提到的局部移动坐标系可以参考《3D Math Primer for graphics and game development》3.5节Coordinate Space Transformations进行理解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenGL笔记之矩阵变换(Matrix Transformation) 的相关文章

  • 3D 图形矩阵 4x4 中最后一行的 magic 4 的用途是什么?

    当我阅读有关WebGL的书时 我看到了下一个矩阵描述 有关于书中最后一行的信息 WebGL 初学者指南 初学者指南 Diego Cantor Brandon Jones 神秘的第四排 第四排没有任何特殊之处 意义 元素 m4 m8 m12
  • Qt 5 和 OS X Mavericks 问题

    我正在使用 Cmake 在 OS X 10 9 上构建 QT 项目 自 Mavericks 以来 OpenGL 标头的位置似乎发生了变化 文件夹 System Library Frameworks OpenGL framework Head
  • 静态链接库时出现 glew 链接器错误

    我正在尝试在 Visual Studio 2012 中构建一个 opengl 项目 我想静态包含 glew 库 因此我从源代码构建它并将生成的 glew32sd lib 复制到我的 lib 目录 我将此 lib 路径提供给 Visual S
  • 使用 openGL、SOIL 加载图像

    我尝试了很多使用 SOIL 在 openGL 中加载和显示图像的示例 运行下面的源代码时 它仅显示一个没有图像的白色四边形 我尝试打开一个名为 foto 的图像 我将图像文件放在程序的文件夹中 bool keyStates new bool
  • glibc 已弃用的 __malloc_hook 功能的替代方案

    我正在为 C 编写一个内存分析器 并为此拦截对malloc realloc and free通过 malloc hooks 函数 不幸的是 这些已被弃用 因为它们在多线程环境中表现不佳 我找不到描述实现相同目标的替代最佳实践解决方案的文档
  • 退出 glutFullScreen()

    我不明白为什么当我按 f 时它进入全屏但不退出全屏 在这个方法的开头我已经设置了bool fullscreen false 这是我的切换代码 case f toggle screenmode if fullscreen glutFullSc
  • CPU 到 GPU 法线映射

    我正在创建一个地形网格 然后这个答案 https stackoverflow com a 5284527 1356106我正在尝试将 CPU 计算法线迁移到基于着色器的版本 以便通过降低网格分辨率并使用在片段着色器中计算的法线贴图来提高性能
  • 在执行期间访问.eh_frame数据

    我正在尝试访问以下内容 eh frame正在运行的程序的一部分 具体来说 该程序是 Linux 内核 2 6 34 8 这 eh frame包含用于异常处理的有用数据 我想在内核代码内部使用它 该部分已经由以下人员编写gcc readelf
  • gluPerspective 与 gluOrtho2D

    我查看了 MSDN 上关于这两个函数的文档 但是 我不太明白这两个功能之间的区别 一个是用于设置 3D 相机视图 另一个是用于设置 2D 相机视图 如果能得到解答就太好了 预先感谢您的评论 正交投影基本上是没有透视的 3D 投影 本质上 这
  • 使用 glDrawElements 时在 OpenGL 核心配置文件中选取三角形

    我正在使用 glDrawElements 绘制三角形网格 并且希望能够使用鼠标单击来拾取 选择三角形 三角形的网格可以很大 在固定功能 OpenGL 中 可以使用 GL SELECT http content gpwiki org inde
  • lwjgl 3 , glUniformMatrix4 导致 jre 崩溃

    我正在使用 lwjgl 3 并学习现代 opengl 3 我想将统一矩阵发送到顶点着色器 以便我可以应用转换 我尝试过 但程序因此错误而崩溃 A fatal error has been detected by the Java Runti
  • 阻止 OpenGL.framework 在 Cocoa 应用程序中加载

    我的应用程序链接到这些框架 Cocoa Framework AppKit Framework CoreData Framework Foundation Framework 请注意 OpenGL Framework 是NOT已链接 但是 设
  • Eclipse 标记 OpenGL 函数无法解析

    我尝试在 Eclipse C C 中使用一些 OpenGL 函数 一些 标准 函数如 GlClear 可以被 eclipse 识别 而其他函数如 glBindBuffer 和 glEnableVertexAttribArray 则不能 它们
  • NV_path_rendering替代方案[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我刚刚观看了 Siggraph 2012 的一个非常令人印象深刻的演示 http nvidia fullviewmedia com sig
  • glut 库中缺少 glutInitContextVersion()

    我正在练习一些 opengl 代码 但是当我想通过以下方式强制 opengl 上下文使用特定版本的 opengl 时glutInitContextVersion 它编译过程失败并给出以下消息 使用未声明的标识符 glutInitContex
  • SDL 鼠标位置调整大小后裁剪

    我在 SDL 中的鼠标位置上遇到了一些奇怪的行为 如果我将窗口大小调整得更大 则任一鼠标事件的 x y 位置似乎都限制为原始窗口的宽度和高度 如果我缺少一些函数调用来告诉 SDL 鼠标区域的大小已增加 应用程序的相关部分 void Resi
  • 如果我用opengl绘图的话SDL Renderer就没用了吗?

    我正在学习 SDL2 但我也在使用使用 OpenGL 调用的 imgui 库 从我在网上各种博客上读到的内容来看 我无法轻松混合 SDL2 渲染器和 opengl 调用 我要么使用其中之一 要么使用另一个 我读过的大多数教程都使用渲染器 所
  • PyQt5 的 OpenGL 模块和版本控制问题(调用不正确的 _QOpenGLFunctions_(ver))

    我一直在努力得到PyQt5 helloGL 示例代码 https github com baoboa pyqt5 blob master examples opengl hellogl py编译 当我尝试构建解决方案时 我得到 Traceb
  • Visual Studio 2010 中的 SOIL 设置

    我无法得到SOIL http www lonesock net soil html正确使用 Visual Studio 2010 我远非 VS 专家 但据我所知 只需执行以下步骤即可使环境正常运行 属性 gt gt C C gt 常规 gt
  • Glew+GLFW Win32 无依赖项 Visual Studio

    是否可以在不将文件复制到 C 的情况下构建并链接 Glew 和 GLFW 我找不到任何说明如何在不将 DLL 复制到 C 上的 Visual Studio 目录的情况下使用这些库的文档 我只想包含项目目录中所需的所有 dll 和 lib 文

随机推荐

  • 【华为OD机试】最大花费金额 (C++ Python Java)2023 B卷

    题目描述 双十一众多商品进行打折销售 小明想购买自己心仪的一些物品 但由于受购买资金限制 所以他决定从众多心仪商品中购买三件 而且想尽可能的花完资金 现在请你设计一个程序帮助小明计算尽可能花费的最大资金数额 输入描述 输入第一行为一维整型数
  • 【AI with ML】第 1 章 :TensorFlow 简介

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 并发编程(三)——多线程之间如何实现通讯

    前言 欢迎大家一起来学习多线程 大家一起来学习吧 并发编程 一 多线程快速入门 并发编程 二 内存模型 并发编程 三 多线程之间如何实现通讯 并发编程 四 JUC并发包常用方法介绍 并发编程 五 线程池及原理剖析 并发编程 六 java中锁
  • 设置PWM占空比中TIM_SetCompare1,TIM_SetCompare2,TIM_SetCompare3,TIM_SetCompare4分别对应引脚和ADC通道对应引脚

    这个函数TIM SetCompare1 这个函数有四个 分别是TIM SetCompare1 TIM SetCompare2 TIM SetCompare3 TIM SetCompare4 位于CH1那一行的GPIO口使用TIM SetCo
  • leetcode-283-移动零

    移动零 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 示例 输入 0 1 0 3 12 输出 1 3 12 0 0 说明 必须在原数组上操作 不能拷贝额外的数组 尽量减少操作次数 解法一 计算
  • STM32L4-RS485+DMA中断通信实验+字节丢失处理[寄存器版]

    基本设置 MCU采用 STM32L431RCT6 485芯片采用 ADM3485 采用串口经由RS485 使用DMA向串口调试助手传送数据 相关配置与前文基本相同 STM32L4 双路RS485自收发通信实验 寄存器版 staypt的博客
  • 我看鸿蒙操作系统

    华为宣布推出鸿蒙操作系统 其实我觉得能理解 但也蛮无奈的 所谓不得已而为之 google不提供后续版本授权 不提供新的支持 怎么办 硬着头皮也要上 有些自媒体说什么安卓慌了 google吓坏了 我真的想骂人 一群王八蛋为了点击率什么都敢写
  • 日志分析 入侵检测--实战

    收到客户服务器被入侵消息 希望我给他做一次入侵排查 刚做完顺手记录一下 入侵排查思路 0x01 日志分析 1 爆破ip统计 grep i Failed var log secure awk print NF 3 sort uniq c so
  • fgets()

    fgets 函数简介 读字符串函数fgets 的功能是从指定的文件中读一个字符串到字符数组中 函数调用的形式为 fgets 字符数组名 n 文件指针 要从键盘输入时文件指针的参数为 stdin 其中的n是一个正整数 表示从文件中读出的字符串
  • Springboot中创建拦截器

    目录 目的 实现过程 1 创建拦截器 2 注册拦截器 完整代码 目的 在Springboot项目中创建拦截器 在进入Controller层之前拦截请求 可对拦截到的请求内容做响应处理 如 校验请求参数 验证证书等操作 实现过程 1 创建拦截
  • PTS测试

    PTS性能测试 一 什么是性能测试 性能测试PTS Performance Testing Service 是一款简单易用 具备强大的分布式压测能力的SaaS压测平台 PTS可以模拟复杂的业务场景 并快速精准地调度不同规模的流量 同时提供压
  • JAVA中String及String常用的方法

    String string是表示字符串的字符串类 public class StringDemo public static void main String args 常见面试题 String s new String hello 问 如
  • Assuming drive cache: write through

    我也遇到过 关机重启就可以了
  • linux内存管理(十四)-内存OOM触发分析

    在内存分配路径上 当内存不足的时候会触发kswapd 或者内存规整 极端情况会触发OOM 来获取更多内存 在内存回收失败之后 会进行OOM OOM的入口是 alloc pages may oom 文件位于mm page alloc c中 s
  • 线代——基础解系 vs 特征向量

    基础解系 基础解系的概念是针对方程而言的 齐次线性方程组的解集的最大无关组称为齐次线性方程的基础解系 要求齐次线性方程组的通解 只需求出它的基础解系 例 特征向量 特征向量和特征值满足关系式 A A
  • 物理学家的Python

    特点 从基本的交互式 Python 开始 熟悉该语言 详细讨论了所有程序清单 介绍了 Matplotlib 图形 用于生成表示数据和函数图的图形 例如场线 考虑了动画函数图 有一章专门讨论代数方程和超越方程的数值解 讨论了基本的数学原理 并
  • 之前的一些笔记 py

    cmd清空 cls win e 打开我的电脑 好习惯 文件夹后面写数字表明软件的版本 怎么将2个分开的网页窗口合并成一个 鼠标按住一个窗口中的标签页不放 并向其它窗口的标题栏中拖动 即可把当前标签页合并到其它窗口中 注意 一定要按住标签页拖
  • 学习OpenCV——Surf(特征点篇)&flann

    Surf Speed Up Robust Feature Surf算法的原理 1 构建Hessian矩阵构造高斯金字塔尺度空间 其实surf构造的金字塔图像与sift有很大不同 就是因为这些不同才加快了其检测的速度 Sift采用的是DOG图
  • 我的博客即将同步至腾讯云+社区

    我的博客即将同步至腾讯云 社区 邀请大家一同入驻
  • OpenGL笔记之矩阵变换(Matrix Transformation)

    OpenGL笔记之矩阵变换 Matrix Transformation 分类 OpenGL 2012 08 06 21 21 3968人阅读 评论 1 收藏 举报 transformation matrix math 图形 影视 本文是学习