求一个向量变换为另一个向量的矩阵_OpenGL里旋转等变换矩阵为什么是4x4的矩阵...

OpenGL ES 的很多教程里都会有这样一个例子来讲解纹理:将一张图片作为纹理显示在屏幕上。

因为纹理坐标和实际屏幕显示的坐标不一样,把图片渲染在屏幕上后,图片是上下颠倒的。

一个解决方法是对当前的顶点坐标,乘以绕 z 轴旋转180度的矩阵,这样图片就能正确显示了。

那么如何理解这个旋转矩阵呢?

影响我们理解这个矩阵的第一个问题是:

为什么这个矩阵是 4x4 的? 而且我们发现旋转,缩放、平移等变换矩阵都是 4x4 的。

在直观上的认知里,表达一个三维空间的坐标用 x,y,z 就足够了,那在三维空间里进行矩阵变换,用 3x3 的矩阵就够了,为什么需要 4x4 呢?

为了回答这个问题,下面我们先在几何意义上理解**向量和矩阵之间的关系,然后通过推导旋转矩阵**和平移矩阵,一步步来解开这个疑惑。

向量和矩阵

在几何平面上,我们可以把平面上任意一,当作与原点组成的一个 向量 来理解。

如图 ,A 点可以表示成向量    ;在 x 轴和 y 轴上各有 i 点(1, 0)和  j 点(0,1),同样的,让它们与原点组成向量,为了简化,我们用    和 表示这两个向量。

a80c0d3d9213afafc7ca05d1cf0a4366.png
向量和矩阵

因为 A 点的坐标为 (3, 2),如果我们要用    和  表示 ,那是这样的:

这里的几何意义是 延展到  , 延展到 ,然后把这两个向量相加即可得到

i  坐标是 (1, 0),j 坐标是 (0,1),我们把上面这个等式转换成竖列的形式:

这里其实是向量的简单运算,运算过程如下:

看到运算过程是否有种似曾相识的感觉?这不就是矩阵与向量的乘法计算吗?这个运算其实就是将向量左乘一个矩阵 的计算:

这里  其实就是单元矩阵,左乘一个单元矩阵并不会改变原来的值。而这个单元矩阵以两个竖列来看,正是 i 和 j 点的坐标,也是向量    和   ,在数学上将    和    称为此坐标系的 基向量

推导旋转矩阵

我们现在把整个坐标轴绕原点逆时针旋转   :

47328d05bdadc84b6176e536afc9ce45.png
推导旋转矩阵

旋转后  i 点和 j 点对应    和   位置。

通过简单的三角函数计算得到: 坐标为 , 坐标为

旋转后,A 点的坐标是多少呢?回顾上面的做法, 延展到  , 延展到 ,然后把这两个向量相加即可得到 。结合上面一节矩阵和向量的推演,可以变成下面的形式:

我们发现,左边的矩阵不正是开头所看到的 旋转矩阵 吗?只不过这是二维平面上的旋转矩阵:

结合图形和计算,我们可以这样理解这个二维矩阵:二维矩阵代表一个坐标系里的两个基向量,而在这个坐标系里的点与原点组成的向量,都可以用这两个基向量的变换来表示。那么旋转一个点,可以转换成旋转这个点所在的坐标系,从而通过变化的基向量求出旋转后的点的位置。

其实这种变换在数学上称作 线性变换 ,线性变换是通过 矩阵乘法 来实现

线性变换:是在两个向量空间(包括由函数构成的抽象的向量空间)之间的一种保持向量加法和标量乘法的特殊映射

线性变换在几何直观上有如下特点:

  • 变换前后,直线仍然保持是直线的状态

  • 变换前后,原点保持固定,不会变化

我们从二维平面,推导到三维坐标也是同理,只不过是多了个 z 轴

竖着来看这个矩阵,是 x,y,z轴上的三个基向量,同时它又是一个单元矩阵。

同理上面二维平面的推导,三维坐标绕 z 轴的旋转矩阵为:

推导平移矩阵

那么平移操作,能不能也用这种矩阵与向量相乘的形式呢?我们再次回到二维平面,看看将 A 点平移到 B 点的情况是怎样的。

2e18fa8aa884624650aaab85cea6f047.png

要将 A 点(3,2)平移到 B 点(4,5),实际上就是先将 A 点往右移动 1 ,再往上移动 3,即 x 坐标值增加 1,y坐标值增加 3

从上面的运算来看,平移这种操作实际上是 向量的加法,即:

我们可以通过向量加法的 平行四边形法则 加深理解,如下图:

eb7671b789fd483612f3e4d01c176d84.png

对于平移这种操作,我们无法仅仅通过矩阵乘法来实现

而实际上,平移这种操作属于 仿射变换

仿射变换,又称仿射映射,是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。

仿射变换在几何直观上,相比线性变换,它不需要保证变换前后坐标原点不变。

如下图,从 A 点平移到 B 点,我们换一个角度思考,这次不移动点,而是移动整个坐标轴,同样可以达到平移 A 点到 B 点的需求,但是坐标原点移动到了 O' 点(1,3)。

019360972d455e82ccf7e00b30837a6e.png

我们希望构造的是像下面这种矩阵乘法的等式,这样才能用一个通用的计算模式来处理坐标点的变换。

矩阵

到这里,我们终于要请出 齐次坐标 了。

齐次坐标就是将一个原本是 n 维的向量用一个 n+1 维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。

用一个通俗的讲法是,我们需要 升维 来处理这个问题。

通过增加一个维度,我们可以在高维度上,通过线性变换来处理低维度的仿射变换。

这句话咋一听感觉很有哲理,但是通过下面的数学等式就能知道其中的奥妙:

观察上面的运算过程,结果 不正是我们上面所得的 吗?只不过多了一个 z 轴的坐标值。

我们通过升级一个维度,将在二维平面上的平移问题转换成了在三维坐标的矩阵和向量乘法。那么在二维平面上,这个平移矩阵就为:

tx 和 ty 就对应在 x 轴 和 y 轴上的移动距离。

同理推广到三维坐标系,要实现三维坐标的平移操作,同样需要通过升维,引入齐次坐标来计算。那么三维坐标下的平移矩阵就为:

总结

至此,我们可以回答最开始的问题了,为什么 OpenGL 里的矩阵变换是 4x4 的矩阵呢?

我们来想象这样一个场景:如果我要让顶点坐标旋转一定角度后,再平移一段距离,那么这里面的操作就涉及 3x3 矩阵的计算和 4x4 矩阵的计算,如果不统一起来,这种连续变换的计算操作将很复杂。

所以如果要用矩阵乘法来统一所有的平移、旋转等等变换计算,为了照顾到平移这类仿射变换,统一用 4x4 矩阵来计算既能满足场景又方便计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白鹭时代与html5关系,白鹭时代观点:HTML5行业将进入红利收割期

2016年,H5产业风风火火,各种引人注目。最大成果无疑是游戏《传奇世界H5》月流水破了3000万,引起整个行业巨大震动,同时,也标志着H5重度游戏时代来临。国内最大的HTML5移动技术与服务供应商白鹭时代认为,201…

boot定时任务开启和关闭 spring_Spring之定时任务实践

Java下的定时任务实现有Timer,Spring,QuartZ等,这里我们介绍Spring中定时任务的应用,其通过 Scheduled 注解即可轻松实现概述Spring 的定时任务可以支持各种形式的定时调度任务。其通过加在定时方法上的 Scheduled 注解来配置任务…

计算机怎么取消用户密码,怎么取消开机密码:计算机开机进入Windows时的开机密码怎么取消?...

优质回答 回答者:168长腿欧巴在电脑中的“用户账户”界面即可设置取消开机密码,具体操作请参照以下步骤。1、右键Win10系统的开始菜单,选择弹出菜单里的“运行”选项。2、然后在出现的运行对话框里输入命令“netplwiz”,点击确定。…

echarts symbol 回调函数_【OpenLayer 实战】实现仿Echarts风格的动态迁徙图/航班图

使用的数据还是来自echarts,模拟了全国各地到湖南重点景区的客流情况。分析要实现动态迁徙图的效果,主要需解决两个问题 曲线的绘制。因为给出的数据只有起点和终点两个点位,所以想要绘制曲线可以参考turf中的bezier曲线生成API。 点迹…

校运会计算机科学系大本营,计算机系团总支学生会学期总结大会

(本网讯)时光飞逝,又一个学期即将就此画上了圆满的句号。为推动我系团总支学生会工作更长久的发展,提高学生会干部工作的热情和质量,2016年12月8日晚上19:00在第一教学楼C102课室里,校学生会全体成员齐聚一堂,参加了20…

hexo评论_【前端简历加分】hexo框架搭建个人博客站点,手把手教学

最近,粉丝们在金九银十期间也是不断的面试,有比较多的毕业生说我在这个期间出多一些面试题,上几期都是倾向于面试文章,这期出一次简历加分项操作,使用hexo框架搭建个人博客。作为应届毕业生或者1-3年工作经验的程序员拥…

电脑抓整个路由器的包_网络是电竞游戏体验的命脉 2018年年度电竞路由器功能盘点...

2018年是电竞路由器的元年,从2017年的概念产品诞生开始,电竞路由器很快就确定了品类,随着《绝地求生》、《王者荣耀》等对网络质量敏感的竞技游戏的火爆,电竞路由器迅速被竞技玩家熟知,并在2018年以野火燎原的速度发展…

dos 改某个目录下所有文件的时间_go语言入门学习笔记(2)-DOS操作及go语言变量学习...

API:application program interface:应用程序编程接口。就是我们go的各个包的各个函数。我们想要了解这些函数我们可以通过Go的中文网在线标准库文档:https://studygolang.com/pkgdocDOS介绍:Dos:Disk Operating System 磁盘操作系…

es multi match_PHP 的ES搜索操作

原文:https://blog.csdn.net/JineD/article/details/106650695首先从ES的支持的字段说起,ES文档中字段有多种类型 官方文档。这几个比较常用:text,keyword,integer,float,boolean,object,geo_point(地理坐标),geo_shape(描述地理区域),date.注…

git 怎么还原历史版本_4. Git--修改/回退等操作

》》点赞,收藏关注,理财&技术不迷路《《我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:Git is a distri…

为什么用python写爬虫_零基础,是怎么开始写Python爬虫的

刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件。利用这些数据,可以做很多领域的分析、市场调研,获得很多有价值…

datatable怎么根据两列分组_谈谈怎么做服务隔离

来源于公众号孤独烟 ,作者孤独烟引言OK,如下图所示那显而易见,做服务隔离的目的就是避免服务之间相互影响。毕竟谁也不能说自己的微服务百分百可用,如果不做隔离,一旦一个服务出现了问题,整个系统的稳定性都…

position: absolute;_前端性能优化--transform与position

上个星期去yy语音面试&#xff0c;就有一个这样问题&#xff1a; transform与position:absolute 有什么区别? 我回家后查资料发现这道题目其实不简单啊&#xff0c;涉及到重排、重绘、硬件加速等网页优化的知识。首先看一个用top、left实现的动画效果<style>html,body {…

台式计算机总是重启,台式电脑经常自动重启怎么修复

当我们的电脑出现了电脑自动重启的时候&#xff0c;我们就要注意了&#xff0c;说明我们的电脑主机出现问题了&#xff0c;怎么解决呢。下面是学习啦小编为大家整理的关于台式电脑经常自动重启的相关资料&#xff0c;希望对您有所帮助!台式电脑经常自动重启的解决方法方法/步骤…

线程执行完之后会释放吗_java多线程并发:CAS+AQS+HashMap+volatile+ThreadLocal,乐分享...

CyclicBarrier、CountDownLatch、Semaphore 的用法CountDownLatch(线程计数器 )CountDownLatch 类位于 java.util.concurrent 包下&#xff0c;利用它可以实现类似计数器的功能。比如有一个任务 A&#xff0c;它要等待其他 4 个任务执行完毕之后才能执行&#xff0c;此时就可以…

计算机应用基础考查方案,《计算机应用基础》考查方案

《计算机应用基础》考查方案 《计算机应用基础》考核方案 制订人&#xff1a;刘久红老师 计算机应用基础科任教师 制订部门&#xff1a;基础课与思政课教学部 制订时间&#xff1a;2012年12月 一&#xff1a;考核依据 计算机应用基础是面向全院各专业开设的一门重要的公共基础课…

无法启动此程序因为计算机丢失msvcr110.dll,计算机中丢失msvcr110.dll怎么办

我们在打开电脑程序的时候&#xff0c;系统提示无法启动此程序&#xff0c;因为计算机中丢失MSVCR110.dll&#xff0c;尝试重新安装该程序以解决此问题。这是什么情况呢?因为现在所有的5.5环境都是基于vc11的编译脚本下生成的&#xff0c;所以在windows下你得安装相关组件&…

anaconda pandas运行不了_学习python你必须弄懂的 Python、Pycharm、Anaconda 三者之间的关系...

Python作为深度学习和人工智能学习的热门语言&#xff0c;学习一门语言&#xff0c;除了学会其简单的语法之外还需要对其进行运行和实现&#xff0c;才能实现和发挥其功能和作用。下面来介绍运行Python代码常用到的工具总结。一.Python、Pycharm、Anaconda关系介绍1. PythonPyt…

java: 程序包com.alibaba.fastjson不存在_Java开发中的异常

NO.1 Java.alng.NullPointerException这个异常大家肯定都经常遇到&#xff0c;异常的解释是 “程序遇上了空指针 “&#xff0c;简单地说就是调用了未经初始化的对象或者是不存在的对象&#xff0c;这个错误经常出现在创建图片&#xff0c;调用数组这些操作中&#xff0c;比如图…

关于csgo的观看录像fps低_CSGO:Ququ带队击败LQ豪取五连冠,8次MVP闪耀全场

电子竞技热点资讯&#xff0c;敬请关注老年人三旬&#xff01;自从CSGO这款游戏上市之后&#xff0c;在整个FPS领域内就一直处于顶流位置&#xff0c;这款游戏对于所有热爱射击游戏的玩家来说&#xff0c;不但是经典作品《半条命》的延续&#xff0c;更是一款对玩家要求极高的游…