OpenGL的矩阵变换详解——有图有真相
OpenGL有个小小的难点,就是矩阵变换的顺序问题。一不小心就会用错,变换后的物体和自己想要的完全不一样。为了自己的理解,也为了帮助别人的理解,我下面对矩阵变换做一个解释。当然,大片大片的文字肯定会让大家看的云里雾里,所以我特意画了一些示意图供大家理解。
首先向大家明确一点,当你在程序中调用矩阵变换函数时,实际执行顺序和调用顺序刚好相反,例如:
glm::mat4 trans;trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
调用顺序是先平移,再旋转。但是代码执行的时候,是先旋转后平移。这是为什么呢?主要是由于矩阵乘法右乘的特性。
假如有一个顶点假设我们有一个顶点(x, y, z),我们希望将其缩放2倍,然后位移(1, 2, 3)个单位。那么进行的矩阵运算则如下图所示:
上面图中每个矩阵中间都有数字,用于标记这个矩阵,和描述矩阵。
1矩阵 * 2矩阵 = 3矩阵。3矩阵 * 4向量 = 最终变换结果。
也就是:
1矩阵 * 2矩阵 * 4向量= 最终变换结果。
根据矩阵和向量运算的性质,4向量先和2矩阵运算,再和1矩阵运算。所有,调用顺序刚好和执行顺序相反。
明白了执行顺序和调用顺序不同之后,咱们再来了解下。变化顺序不同会带来什么影响。
比如先向右平移2个单位,再顺时针旋转90度,和先顺时针旋转90度,再向右平移2个单位,有啥区别?
上图:
让其先平移两个单位,再顺时针旋转90度后的图片如下:
如果先顺时针旋转90度,再向右平移2个单位,则与上图效果完全不一样。如下:
造成这种现象的主要原因是:变换操作是相对于当前位置来进行的。
其他的类似,请大家举一反三。
OpenGL的矩阵变换详解——有图有真相相关推荐
- openGL API glVertexAttribPointer详解
openGL API glVertexAttribPointer详解 文章目录 openGL API glVertexAttribPointer详解 一.官方文档 二.翻译 例子 运行结果 代码下载 ...
- openGL API glUniformMatrix4fv详解
openGL API glUniformMatrix4fv详解 文章目录 openGL API glUniformMatrix4fv详解 官网 翻译 1.函数原型 2.参数列表: 3.描述: 4.描述 ...
- openGL API glProgramUniform详解
openGL API glProgramUniform详解 前言 一.官方文档 二.翻译 例子 运行结果 代码下载 前言 openGL API 之glProgramUniform详解 一.官方文档 g ...
- OpenGL函数库详解
1.glClear(GLbitfield mask); 功能:用预先设置的值清除缓冲区. 参数说明:mask指定被刷新的缓冲区,可以是GL_COLOR_BUFFER_BIT. GL_DEPTH_BUF ...
- OpenGL ES入门详解
http://blog.csdn.net/wangyuchun_799/article/details/7736928 版权声明:本文为博主原创文章,未经博主允许不得转载. 1.决定你要支持的Ope ...
- iOS OpenGL 纹理坐标详解
//顶点着色器 //v.shader//顶点着色器是一个可编程的处理单元,执行顶点变换.纹理坐标变换.光照.材质等顶点的相关操作,每顶点执行一次.替代了传统渲染管线中顶点变换.光照以及纹理坐标的处理, ...
- SpringBean生命周期详解 | 有图有真相
文章目录 Spring IOC 1. 首先是谁控制谁? 2. 什么是反转? 3. 谁依赖谁? 4. 谁注入谁? spring ioc的加载过程 Spring Bean的生命周期 实例化 1.实例化前置 ...
- 欧尼酱讲JVM(17)——方法区详解有图有真相
目录 位置图解 方法区的理解 方法区在哪里 方法区的基本理解 HotSpot中方法区的理解(演进过程) 方法区的内部结构 图解方法区内部结构 运行时常量池 class文件中常量池的理解 为什么需要常量 ...
- OpenGL gluLookAt函数详解
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 下面的一 ...
最新文章
- 在Ubuntu18.04上安装opencv 3.4.1
- 皖西学院微型计算机原理期末试卷,皖西学院 电气微机原理试卷A
- sklearn中cross_validation包无法使用
- AlphaGo之父亲授深度强化学习十大法则
- 听力阈值计算_中耳功能分析:临床听力测试的重要手段!
- 产品设计美学案例分析_美学在产品设计中的重要性
- 了解一下Elasticsearch的基本概念
- java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
- java复习系列[3] - Java虚拟机
- The program ‘roscore‘ is currently not installed 解决办法
- linux 端口转发 udp,Linux Socat TCP/UDP端口转发及使用
- 城市空气质量监测系统解决方案
- Windows 各平台远程桌面客户端
- 4、混合、股票型基金
- 二元Weierstrass逼近定理及其证明
- Thread-Specific Storage Pattern
- 软件评测师:数据库知识
- (C#)Windows Shell 外壳编程系列总结
- 〖ChatGPT实践指南 - 零基础扫盲篇⑤〗- OpenAI API 演示 Demo 之宠物名字生成器
- 如何在 Mac 上卸载 Java
热门文章
- php-新特性之match解析
- 报表动态配置的技术实现
- 节日活动发布,选对H5让你在老板面前大放异彩!
- 如何寻找有价值的行业报告
- python有限元传热求解_有限元在传热学中的应用讲解
- 如何用U盘拷贝4G以上的文件?
- 关于Java RDP协议实现远程桌面连接的开源项目properjavardp
- php字符窜转json_php如何将字符串转换json
- 在线网校安装简易迅捷入门安装教程
- 迪士尼举办“好奇无界:米奇艺术展”中国巡展;延安万达嘉华及万达锦华酒店在延安红街开业 | 全球旅报...