计算机图形学一:基础变换矩阵总结(缩放,旋转,位移)
变换矩阵总结
- 摘要
- 1 2D线性变换
- 1.1 缩放(scaling)
- 1.2 剪切(shearing)
- 1.3 旋转(rotation)
- 2 3D线性变换
- 2.1 3维缩放(scaling),剪切(shearing),旋转(rotation)
- 2.2 3维绕任意轴旋转
- 3 仿射变换
- 3.1 位移(translation)
- Reference
(本篇文章同步发表于知乎专栏:https://zhuanlan.zhihu.com/p/144323332 欢迎三连关注)
摘要
变换矩阵 (Transformation Marices) 在图形学中的重要性不用多说,一切物体的缩放,旋转,位移,都可以通过变换矩阵作用得到。同时在投影 (projection) 变换的时候也有很多应用,本文将会介绍一些简要的变换矩阵。
1 2D线性变换
我们将如下图所示的简单矩阵乘法定义为对向量(x,y)T(x,y)^T(x,y)T的线性变换。
1.1 缩放(scaling)
缩放变换是一种沿着坐标轴作用的变换,定义如下:
即除了(0,0)T(0,0)^T(0,0)T保持不变之外,所有的点变为(sxx,syy)T(s_xx,s_yy)^T(sxx,syy)T。
举两个简单例子:
1.2 剪切(shearing)
shear变换直观理解就是把物体一边固定,然后拉另外一边,定义如下:
分别对应了向"拉伸"x轴,和"拉伸"y轴
直观理解见如下两图:
1.3 旋转(rotation)
旋转可以说是又一个十分重要的变换矩阵了,如下图,我们希望用一个变换矩阵表示将向量a\bold{a}a旋转到向量b\bold{b}b的位置,
记为
我们可做如下推导得到该矩阵,记向量长度为rrr,则不难得到
进一步我们可以将旋转之后的向量b\bold{b}b的坐标x,y用如下表示
显然,将上一步xax_axa和yay_aya的坐标表示代入得到
此时不难得出该结果即为rotate(ϕ)∗(xa,ya)Trotate(\phi) * (x_a,y_a)^Trotate(ϕ)∗(xa,ya)T的结果了,证明结束。(注意该式是逆时针(countercklockwise)旋转,且原点为旋转中心!)
举例逆时针旋转45°效果如下:
2 3D线性变换
其实知道2维推3维还是非常直观的,只有推3维旋转的时候有一点要注意一下。
2.1 3维缩放(scaling),剪切(shearing),旋转(rotation)
缩放不用多说:
剪切也十分类似:
3维旋转有3个矩阵,分别对应绕x轴,y轴,z轴旋转,同时有很关键的一点要注意!我们所采用的是右手系,因此旋转是有定向(orientation)正如在二维,是x轴向y轴旋转,对应到3维便是绕z轴旋转(x轴转向y轴),不难推出绕x轴旋转(y转向z),绕y轴旋转(z转向x), 如果想不明白,右手螺旋定则试一试就知道了! x->y->z->x…
因此理解了上面这个来看绕x和z旋转的变换矩阵
(绕z轴,故z不变,且x转向y)
(绕x轴,故x不变,且y转向z)
绕y轴会有一点不同,但只要记住需要z转向x,很快便能反应过来
其实到这里可以下一个结论,可以看到任意旋转都是正交矩阵!,因此他们的逆便是他们的转置,而一个旋转矩阵的逆所对应的几何解释便是,我反着转这么多,比如我逆时针转30°,转置便是顺时针30°
注:以上所有的旋转都是针对原点来说,那么如何对围绕任何一个轴(3维)旋转呢
2.2 3维绕任意轴旋转
我们只有绕x,y, z旋转的方法,怎么随便给一个轴让你绕着他旋转呢!很直观的,我们把该轴给先旋转到任意的x,y,z轴上,然后就可以应用基本的旋转矩阵,最后再逆旋转回来即可,表示如下:
R1RxR1T∗(x,y,z)TR1RxR1^T * (x,y,z)^TR1RxR1T∗(x,y,z)T这里的Rx是知道的,问题只剩怎么求R1了,设我们想围绕旋转的轴为uuu,R1便是将u旋转到x的矩阵。
具体来说这里我们需要以u为一轴,构造一个3维正交坐标系,然后将u-x对齐,那么其它两轴就肯定和y和z对齐了!
构造如下,任取一t方向不与u重合
w = t x u
v = u x w
此时u, w, v便是我们构造出的新坐标系(这里运用了一些叉乘的小知识,读者不理解可取自行去了解一下叉乘几何含义再来看此式)。
好了,现在得到了u,w,v 对应 x,y,z如何将我们的新坐标系与原始坐标系重合呢,哈哈,这其实再简单不过了,我们取R1 = (u,w,v), 该旋转矩阵的含义便是将x,y,zx,y,zx,y,z旋转到u,w,v的旋转矩阵(不信可以直接R1 * x,R1y,R1z试试便一目了然),还记得什么?我们上一节曾总结到,旋转矩阵是正交矩阵,旋转矩阵的转置便是它的逆,也是几何意义上的反作用,因此!RTR^TRT便是将u,w,v旋转到x,y,z的矩阵了。现在我们知道了R1知道了RX,那么围绕位移轴的旋转也就得到了!
中间那个矩阵换成 rotate−x(ϕ)rotate-x(\phi)rotate−x(ϕ)就好啦,书上的图懒得改了!
Tips:如果读者对线性代数不熟悉,或是没有很直观的几何理解的话,强烈推荐3blue1brown的线代本质.真的是带你走进全新版本,哈哈哈。
3 仿射变换
其实读到这大部分矩阵变换都已经说完了,只剩最后一个位移,同时也会引入齐次坐标为了更好将位移与rotation,scaling结合再一起,这样能够有旋转scale,又有translation的变换,称之为仿射变换。
3.1 位移(translation)
其实位移是在简单不过的了
我们之前所提到的线性变换如下:
你可以试试如果2维变换只用2维矩阵,3维变换只用3维矩阵,你是不可能将二者合在一起用一个矩阵表示的,所以很自然的,我们引入一维新的坐标,称之为齐次坐标,(x,y)->(x,y,1)
现在我们就可以用一个矩阵即表示线性变换(先做),又表示位移了(后做)!三维其实同理,可以自己写出来看看。
注:最后一维为1,表示点(point), 为0表示方向(direction).方向的位移没有意义,方向始终不会变。
当然,不是只能是1和0,在投影变换中,齐次坐标会有更多的作用。
Reference
[1] Fundamentals of Computer Graphics 4th
计算机图形学一:基础变换矩阵总结(缩放,旋转,位移)相关推荐
- Games101计算机图形学入门基础之一:向量变换、矩阵变换、视图变换、欧拉角与四元数
Games101计算机图形学入门基础之一:向量变换.矩阵变换.齐次坐标.欧拉角与四元数 目录 Games101计算机图形学入门基础之一:向量变换.矩阵变换.齐次坐标.欧拉角与四元数 前言 向量 向量加 ...
- Games101计算机图形学入门基础之二:光栅化
Games101计算机图形学入门基础之二:光栅化 引言 三角形的离散化 采样 走样 走样带来的瑕疵 反走样 先模糊再采样 傅里叶变换 低通滤波 卷积 多重采样抗锯齿(超采样) 深度缓存 可见性与遮挡( ...
- 计算机图形学应用基础考试,计算机图形学基础期末考试试题.docx
计算机图形学基础期末考试试 题 一. 填空 1.将多 形外部一点 A 与某一点 B 用 段 接,若此 段与多 形 界相交的次数 ??????????, 点 B在多 形外部.若此 段与多 形 界相交的次 ...
- 计算机图形学(1)(基础变换矩阵:缩放,旋转,平移)
前言 开始学习图形学之后,真的后悔自己当初线性代数学的不够扎实,在写这一篇学习笔记之前,也是回看了很多关于向量.矩阵.点乘.叉乘的知识. 目录 前言 一.2D线性变换 1.缩放 2.剪切 3.旋转 二 ...
- 平移变换计算机图形学c语言代码,计算机图形学第一次作业——平移,缩放和旋转...
一. MFC 框架下使用 OpenGL 绘图演示平移.旋转.缩放等操作的具体实现 二. 实现算法 绘制的图形以各种顶点及顶点之间的线.面构成 要想对这些图形进行操作,只需要对各种顶点在坐标系中的坐标进 ...
- 计算机图形学(六)——画一个旋转的立方体
画一个旋转的立方体 //画立方体#include <iostream> #define GLEW_STATIC #include"Shader.h" #include& ...
- 计算机图形数学知识,平面----计算机图形学的基础几何知识
平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上. 在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢? 又是怎么样求点到平面的距离? 判断点在平面的 ...
- 【OpenGL】计算机图形学OpenGL基础
前面几节是跟着B站视频学习的OpenGL基础操作,算是熟悉了一下环境,下面进入学习opengl中文教程网站,开始真正进入OpenGL的大门. 下面开始学习计算机图形编程,收获自己做出很酷的东西的喜悦. ...
- 平面----计算机图形学的基础几何知识
平面在数学上的定义是,平面,是指面上任意两点的连线整个落在此面上. 在现实生活中你很容易一眼看出什么平面,但是在计算机的程序里,你将如何表示一个平面的呢? 又是怎么样求点到平面的距离? 判断点在平面的 ...
最新文章
- python爬虫爬取csdn博客专家所有博客内容
- 关系数据库的查询建表
- java 二维数组倒置_Java数组反转及二维数组
- 选择列表和可多选的选择列表
- 早期访问中带有NetBeans的Oracle公共云Java服务
- 阿里 90 后科学家研发,达摩院开源新一代 AI 算法模型
- 如何经由PHP获得MySQL procedure结果
- Regsvr32命令的使用
- 获取所有股票历史数据存到Excel
- 关键词组合工具_关键词的优化方法及搜索工具,亚马逊关键词处理
- AUTOCAD--实时缩放
- 我教你写Makefile,你给我介绍Girlfriends.
- Number精度超了怎么办
- 神秘的罗斯柴尔德家族
- 同一个按钮点击多次不同效果_如何解决竞价推广中的恶意点击?
- 浅析微信小程序的底层架构原理
- log file switch (archiving needed) 等待事件一例
- 用荧光素酶基因标记肿瘤细胞的实验步骤
- 如何有效的阅读一本书
- html怎么引轮播图插件,原生js写一个无缝轮播图插件(支持vue)
热门文章
- Zabbix-agent监控客户端
- 【电大题酷】【1】1200计算机应用基础
- python汉字个数统计
- Fabric 1.0源代码分析(17)gossip(流言算法) #deliverclient(deliver客户端)
- 协同过滤算法之通过Jaccard相似度计算推荐结果原理及代码实现
- 前端开发规范[html篇]
- QT图形界面在工业数据采集显示系统的应用
- ec6110刷linux系统,华为DIIEC6110M_VER_C主板救砖纯净系统烧录固件包下载
- PWA入门:手把手教你制作一个PWA应用
- 但愿这不是真的,可是这是真的……