首页 技术 正文
技术 2022年11月16日
0 收藏 666 点赞 4,357 浏览 1875 个字

提要

在图形的计算中,比如旋转、缩放、平移、投影等操作,矩阵都扮演着极其重要的角色,它是操作图元的基本工具。虽然很多的图形API已经封装好了这些矩阵操作,但是理解这些矩阵操作的原理会非常非常有帮助,比如说我们可以通过一些矩阵的快捷计算来加速你的代码。

如果你有一些线性代数的基础,看下面的内容的时候也不会很轻松,因为有点难且比较没意思,如果没有修过这门课,最好把线性代数这本书拿来看看,因为这些东西真是基础中的基础,而且非常的重要。

齐次记法(Homogeneous Notation)

空间一个点对应的是一个空间的位置,一个向量对应一个方向,两者都可以用一个三维向量 V = (Vx, Vy, Vz)来表示.

这两者如果对于变换(比如旋转,缩放),用一个 3*3 矩阵就可以搞定,但对于平移变换就不适用了,因为位置变换对于向量是没有意义的,而对于点才是有意义的。

齐次记法就是用来解决这个问题的。

在齐次记法下,空间点记为 P = (Px, Py, Pz, Pw), 其中Pw = 1。

空间向量记为 V = (Vx, Vy, Vz, Vw),其中Vw = 0.

当出现Pw!=0 且Pw != 1时,就需要将坐标齐次化了,做法是同除以Pw,记为(Px/Pw, Py/Pw, Pz/Pw, 1).

齐次记法下的变换矩阵如下所示:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

给定一个移动变换矩阵

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

对于一个向量  = (Vx, Vy, Vz, Vw)和 T 相乘之后各值不变。

对于一个点   = (Px, Py, Pz, Pw)和 T 相乘之后结果变为 (Px+tx, Py+ty, Pz+tz, 1).

基础变换

基础的变换包括平移,旋转,缩放,切变,反射,投影等,下面一个个来看。

平移变换

上面已经提到了,平移矩阵用T来表示:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

tx,ty和tz分别表示向x,y,z方向移动的距离,如图

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

注意这个仿射矩阵(Offine Tranform Matrics)对于空间向量是没有作用的。

其逆矩    Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics),表示向相反的方向移动。

旋转矩阵 Rotating

旋转变幻是指绕着一个轴旋转一定的角度,绕x,y,z旋转的旋转矩阵可以记为:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

逆阵   Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics), 表示绕同一个轴按相反的方向旋转相同的角度。

旋转矩阵的行列式都为1,因为它是正交矩阵。

关于图形(或物体)绕自身的某点旋转,其真实的过程是先将物体移动到旋转点与坐标原点相重合的位置,再将图形绕原点旋转,然后再进行平移变换,平移到原先的位置。

整个矩阵计算过程为   Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

缩放变换 Scaling

缩放就是放大和缩小,其矩阵表示为

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

如果 Sx = Sy = Sz,则称为等比变换(uniform),否则就不是(nonuniform)。

其逆阵   Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics),表示按相反的方式进行缩放。

Sx,Sy,Sz中有一个为负数,则改矩阵就是反射矩阵,如果刚好有两个因子为 -1, 则图形旋转 Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics) 。反射矩阵通常需要特殊对待,比如,对于一个三角形,经过反射变换,顶点的顺序就可能会改变,这就会影响到面的法线,光照和背面消隐等算法就会受影响。可以通过计算左上角 3*3 矩阵的行列式的值来进行判断,若行列式的值为负,则是反射矩阵。

切变变换 Shearing

切变变换可以用于游戏中,制作出爆炸的时候画面抖动的效果,一共有六种:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

第一个下标表示要改变的坐标轴,第二个下标表示沿着那个坐标轴变换。相关的矩阵也可以由此得出:第一个下标决定行,第二个决定列,则有:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

效果如下:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

其逆阵:

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

级联变换 Concatenation of Transforms

由于矩阵乘法是没有交换率的,所以矩阵相乘的顺序非常重要,比如 S(2, 0.5, 1)和 Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics), 根据它们执行的顺序不同,得到的结果也会不一样。

Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

将多个矩阵整合到一起的另一个好处是提高了效率,一般的顺序时 TRS。

欧拉变换 Euler TransForm

欧拉变换可以将物体旋转到任意的方向,一个欧拉变换可以分为三个分量 h(ead), p(ich), r(oll),记为E(h,p,r)。

其实就是三个旋转矩阵的级联矩阵:Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics),由于都为对称阵,其逆阵  Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics) =  Real-Rime Rendering (2) – 变换和矩阵(Translation and Matrics)

使用欧拉变换的时候会出现一个很蛋疼的问题-gimbal lock,可以看看这个视频- youtube video explaining gimbal lock

还会出现的一个问题就是两个欧拉角之间的插值问题。

为了避免万圣节锁,一个方法是设定好旋转轴的旋转顺序。

另一中方法是使用四元组。

参考

wiki.变换矩阵 – http://zh.wikipedia.org/wiki/%E5%8F%98%E6%8D%A2%E7%9F%A9%E9%98%B5#.E4.BB.BF.E5.B0.84.E5.8F.98.E6.8D.A2

Real-Time Rendering 3rd

Fundamentals of Computer Graphics 2rd

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,027
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,518
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,365
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,146
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,780
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,857