八边形点坐标数的lisp_图形学入门第五课:齐次坐标

齐次坐标(Homegeneous Coordinates)

在学习齐次坐标之前,我们要先好奇的问一下,为什么要学习齐次坐标。上一节课,我们学习了变换的三种基本形式:旋转,缩放,和切变。但是还有一种特殊的变换:Translation(平移变换)

d082ad3bfa2db367032c6c8b917db972.png

从上边的图中我们可以看到左边的图x在x方向移动后变成了Tx, y在y方向移动变成了Ty,变成了右边的图。我们可以用一种简单的代数来表达:

186af48b631dc7ceaf705d32848f3f93.png

虽然上边的表达看似简单,但是学过矩阵后,我们思考一下,是否可以把上边的平移依然可以像上节课的公式那样写成某一个变换矩阵x 向量(x,y)?

我们会发现,不能。而我们只能写成下面这样一种形式:

b4c54db045c7daa79d6c915a0eec6744.png

因为X' 需要变成ax+by+一个常量,Y'变成bx+cy+一个常量。这种常量的引入,导致平移变换没办法用一个矩阵乘以一个向量的公式来表达。为了统一平移变换跟其他三种变换用一种表达式来表达,人类发明了一种方法:可以通过多添加一个维度,来对齐,统一各种变换。

那么用齐次坐标来表示,针对2D空间中的一个点,可以写成这样一个平移公式:

229f13d9f676a4b071df50896d96c1f1.png

在二维里,一个点和向量可以增加一个维度来表示。

上边的公式,会发现,2D空间中的一个点,我们通过增加第三个维度,多了一个1,或者0来表示。这种表达后,我们就可以在结果中来变相的表达之前代数的表达形式, 如下边红框标注的这样:表示出了线性变化+一个常数

c24181d929495825a94f585603bd6f2b.png

这种通过多增加一个维度来表示2D空间中的点,叫做齐次坐标。

5de84efdfab5aa4e456cf74b07a3f3e5.png

这里要注意到上边的表达。一个2D中的点,如果想用来表示这个点依然是一个标量点,我们给它引入一个等于1的数,变成(x,y,1)。如果想用来表示这个点是个向量,即,从原点指向这个点的一个方向,我们写成(x,y,0)。

思考:我们为什么要把一个点,区分成标量,和向量两种表达呢?一个添加为0,一个添加为1? 

答案:向量被称作向量就是因为它有方向性,它在空间平移后,它的方向是不变。所以向量具有平移不变性。所以,我们用其次坐标来表示一个点的时候,当他跟一个平移矩阵相乘后,得出的向量依然应该是它本身。所以(x,y,0)中的0就起到了保护向量平移后不变的作用,因为0乘以任何数都等于0。那么为什么标量添加的第三个维度是1 呢?我们来看下边四个公式:

b0cccb4bd92550df026e113335a4670a.png

  1. 两个vector相加,依然是个vector。例如三角形法则,两个向量相加,得出一个新的向量。

  2. 空间中两个点相减,表示被减数指向减数的向量。例如:

    (x,y,1)- (x',y',1) = (x-x', y-y', 0) 这样一个 从(x,y)指向(x',y')一个向量。

  3. 一个点 加一个vector:意思是空间中一个点,沿着一个方向移动到一个新的点上。那么依然是一个点。

  4. 一个点加一个点:本身没什么意义。但是我们可以先借助下边的公式:

cbc55d4ca504bba8d2704f7c7334ba92.png

定义:在齐次左边中,空间中的一个w不等0的点,都可以表示成上述w=1的一个2D的点。

那么利用上边这个定义,我们可以得出,两个点相加等于这两个点所形成的线段的中点。 (大家可以自己思考一下为什么是中点?31759c97dec22aa0cffaafb469f2a519.png)

总结: 引用齐次坐标的目的,就是希望把所有的仿射变换都写成一个矩阵乘以一个列矩阵的形式。

对于任何一种变换,如果我们不能只用一个矩阵乘以向量来完成,例如平移这种变换,而且都要额外通过加上一个平移常量,我们管这种变换叫做仿射变换(Affine Transformations)。

仿射变换

所有的仿射变换都可以写成齐次坐标的表现形式:

a37e2fdd80de15dd6ee0474786d77e24.png

我们来看一下齐次坐标的表达式,做一下总结:

  1. 它的最后一行永远是(0,0,1)

  2. 他的平移永远写在最后一列

6b016041a9d5398d1b96c0c3c941be3c.png

那么我们按照齐次坐标的方法,可以把上节课的二维的仿射变换都可以变成齐次坐标来表达:

ef125957131d571eba1830002f5d87c0.png

逆变换(Inverse Transform)

49abbc12a8bdcf9e4b5a627194c80052.png

图中的时钟,经过一个M变化后,变成右边,然后再通过逆矩阵,回到原来的左下角,如上图所示。这就叫逆变换。我们会发现:一个矩阵乘以一个自己的逆矩阵就是单位矩阵。单位矩阵的意思就是没有发生变化。

变化的组合

那接下来我们看变换的组合。思考下边的变换是怎么完成的呢?

7b4dca7c578aa68549a8ae2779688205.png

思考1:我们是否可以先平移然后再旋转?

尝试:先平移,再旋转。

f491700b6df33eab44033cd4012764bc.png

尝试后,我们发现如果先平移再旋转,得到的结果并不是我们想要的。注意,我们所说的旋转是指围绕原点的旋转。

思考2:我们是否可以先旋转然后再平移?

尝试:先旋转,再平移。

5f98882f6a790f2123ec7b1cc6878c47.png

这种尝试是可行的。

通过上边的例子,我们可以得出两个结论:

  1. 复杂的变化可以通过一系列简单的变换来组成

  2. 这些变换的顺序非常重要,顺序的不同,最终的变换结果也不同。

通过上边的两个结论我们转换成矩阵的角度,可以这么解释:

一个向量的变换可以通过多个变换矩阵按照依次的顺序相乘来完成。

所以,变换矩阵的顺序很重要。矩阵相乘不满足乘法交换律。变换矩阵的是从右向左依次施加的。

41a62a8419b52a4e6a83c2a1b8c39951.png

接下来总结公式:

变换的重合

5582f67f04f59bee0191d29727c12226.png

可以把所有的变换矩阵A1,A2,A3。。。An依次相乘,合成一个复杂的变换矩阵。然后跟一个向量相乘,最终完成对一个向量的复杂变换操作。

变换的分解

变换可以重合就可以分解。

思考:下边的一种平移,把下图的左下角的一个图形变换成最右边的那个图形,怎么操作?

答案:先平移到原点,旋转,再平移回去。

cc0a26b40398d2c2d7f549f2b15bb977.png

3D Transformations

为了解决平移这种非线性变换,2D空间中的变换,我们引用了齐次坐标的方法,在解决3D变换的时候,我们也希望用一个统一方法,来解决3D空间中的变换。

ac9c49a3e19ba68f359b6e02d0572ca2.png

3D空间中的一个点,用齐次坐标来表示,引入一个新的数。

1,表示一个点;0表示它是一个向量。

那么(x,y,z,w),其实表示的是三维空间中的一个点:(x/w,y/w,z/w,1),其中那个1表示它是3D空间的中一个点。

所以,在3D空间中,齐次左边所标注的空间的点和矩阵的变换就是一个4x4的矩阵:

63fdfd699e85ed0ea38975c5c3d08dda.png

思考:上边这样的一个公式里,是先线性变换再平移,还是先平移再线性变换呢?

答案:跟2D一样,是先做线性变换,再做平移。

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

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

相关文章

对速度的需求,访问现有数据的速度提高了1000倍

了解如何通过使用标准Java 8流和Speedment的In-JVM-Memory加速器将分析数据库应用程序加速1000倍。 Web和移动应用程序有时会很慢,因为后备数据库很慢和/或与数据库的连接施加了延迟。 现代UI和交互式应用程序需要快速后端,并且理想情况下没有可观察到的…

mysqls压力测试怎么用_用 Swagger 测试接口,怎么在请求头中携带 Token?

松哥周末抽空给 Spring Security 系列也录制了一套视频,目录如下:感兴趣的小伙伴戳这里-->Spring BootVue微人事视频教程今天的话题来自一个小伙伴在微信上的提问:看到这个问题,松哥忽然想到我自己之前写过 Spring BootSwagger…

安卓手机背景变黑色怎么改_别着急扔掉旧手机 你的电脑可能需要它

PC玩家中,不少人都会有在玩游戏时观测电脑硬件状态的习惯。比如查看游戏帧数、CPU频率、GPU频率或是温度等。大多数人都是通过第三方软件,在游戏内把监测数据显示到电脑显示屏角落。可就算是在角落,这些数据依旧会阻挡游戏画面,在…

JDeps入门–分析项目的依赖关系

JDeps是Java依赖关系分析工具 ,这是一个命令行工具,它处理Java字节码(意味着.class文件或包含它们的JAR),并分析类之间静态声明的依赖关系。 可以用各种方式过滤结果,并可以将其汇总到包或JAR级别。 JDeps还…

禅道开源版用户手册_Docker搭建开源版禅道以及项目基本流程介绍

对于自学软件测试的同学来说,经常会遇到这样的困惑:测试用例怎么写?有啥好的模板?缺陷提交的模板是什么样的?bug的生命周期是啥?项目的流程是啥?以上这些困惑,在你仔细看完这篇文章后…

f12 卡 谷歌浏览器_抢券第二课:利用浏览器F12获取优惠券请求链接

抢券第二课为什么迟迟不来呢?因为最近京东没有那种神券需要定点抢购的,我也没法测试我的理论。现在京东的券随时可以领取到,我多没法测试的东西不想就这样欺骗你们。所以今天的第二课我们讲一讲神奇的谷歌浏览器F1201 工具准备一、浏览器这里…

Java命令行界面(第5部分):JewelCli

细算在Java命令行处理与Apache的百科全书CLI , args4j , jbock和命令行中先前的文章,我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。 几个Java命令行处理库使用批注来定义命令行选项。 到目前为止,本系…

dnf用虚拟机会被制裁吗_DNF: 神豪奶妈扬言, 战斗力没有超过他的, 都不配被加buff!...

要说到现在的年轻人们的交友方式绝对少不了游戏交友,以前的人们只要不出门那就是与世隔绝,而现在就算是不出门也可以在网络上结交一大帮朋友,游戏就是现在的年轻人们交友最多的地方之一。科技的发展让游戏进入了一个繁荣的春天,不…

什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?

一、先说何为徽章?徽,最基本的解释是标志、符号;章,基本释义较多,其之一为佩戴在身上的标志,如领章、胸章等。徽章,也就是佩戴在身上用以表示身份、职业或者荣誉的标志。徽章的作用是明确身份、…

Java命令行界面(第10部分):picocli

picocli主页面将picocli描述为“强大的微小命令行界面”,“ picocli”是一个文件Java框架,用于解析命令行参数并生成精美,易于定制的用法帮助消息。 有颜色。” 这篇文章简要介绍了如何使用Picocli 0.9.7处理Java代码中的命令行参数。 像本系…

workunit 的指的工作单元是什么_分频器是做什么用的?

由于现在的音箱几乎都采用多单元分频段重放的设计方式,所以必须有一种装置,能够将功放送来的全频带音乐信号按需要划分为高音、低音输出或者高音、中音、低音输出,才能跟相应的喇叭单元连接,分频器就是这样的装置。如果把全频带信…

合并不同gdb下的相同要素_GDB调试学习

简介GDB是GCC的调试工具。其功能如下:启动程序,使程序按自定义形式运行;使程序停止指定断点位置;程序停止后,检查程序执行中的相应情况;动态改变程序执行环境。gdb调试能进行GDB调试,一般在编译…

endnote文献顺序编号不对_把Endnote装进大脑:行走的文献管理者

是否还迷失在茫茫的文献海洋,东翻西找,仍无法获得需要的文献信息?是否还在半手动导入参考文献,费时费力?别着急,文献管理神器-Endnote轻松帮你搞定这些问题。把Endnote“装进”大脑,你就能成为行…

蔡司三坐标_蔡司三坐标测针的安装指南

1、装配和辅助工具合适的辅助工具可以在组装测针组时有效防止各部件的损坏,确保安装的安全进行。下面是几种最重要的装配和辅助工具。2、正确调整MT/VAST吸盘MT/VAST吸盘可以通过顶部的三个螺丝进行旋转调节。必须使用不超过2Nm的扭力紧固,为了防止螺丝的…

三电平igbt死区时间计算_IGBT基础与运用-2

IGBT基础与运用-1尝试去计算IGBT的开启过程,主要是时间和门电阻的散热情况。C.GE 栅极-发射极电容C.CE 集电极-发射极电容C.GC 门级-集电极电容(米勒电容)Cies CGE CGC 输入电容Cres CGC 反向电容Coes CGC CCE 输出电容根据充电的详细过程,可以下图…

在2017年从Maven工件生成P2存储库

几年前,我写了一篇博客文章,介绍如何基于Maven工件生成P2存储库。 如今,这种描述的方法已经过时了,我想展示一种基于p2-maven-plugin的新方法,该方法是为解决该问题而创建的。 Maven构建生命周期中的P2-Maven-Plugin集…

循环次数几次_圆柱模板循环使用次数是多少呢

对于同一处做同样的工程,如果需要使用的是圆柱模板,用户一定考虑到底该进多少货,备多少料(圆柱模板)呢?这就需要考虑到圆柱模板循环使用次数和错开的程度来进行决定的?建筑圆柱模板能周转几次?这可能是所有…

network 拦截不到东西是怎么做到的?_都说读中职院校学不到东西,中职学生到底是怎么学习的?...

中职院校在社会中的影响一直并不是很好,一直都是负面影响高于正面影响,那么,我们不禁就要问了,一直在喊提升中职院校的教学质量,质量提升到哪里去了呢!那些中职院校里的学生到底又是怎么学习的呢&#xff1…

数组中查找並返回数组_java数组查找常见情况

一.最简单的查找元素方法(依次比较):给一个数组,在数组里面查找某个元素在数组中的位置,并返回它的位置。public static void main(String[] args) {int arr[] new int[]{12, 4, 54, 57, 87, 3, 41, 1, 3, 4, 1, 3, 4…

阿帕奇跨域_阿帕奇骆驼遇见Redis

阿帕奇跨域键值商店的兰博基尼 Camel是最好的面包集成框架,在本文中,我将向您展示如何通过利用另一个出色的项目Redis使它更加强大。 Camel 2.11即将发布,具有许多新功能,错误修复和组件。 这些新组件中的几个是我创作的&#…