图形变换
图形变换
(注:这里的向量均是列向量,而direct3d里的向量是行向量,所以这里的转换矩阵的转置矩阵才是direct3d的矩阵,而且这里用的是右手坐标系,而direct3d用的是左手坐标系)
物体变换和坐标系变换
物体变换就是在坐标系中对物体进行变换,而坐标系变换就是物体各点没有变换,而坐标系变换,相当于在另一个坐标系中描述该物体。
而这两种变换实质是等价。将物体变换一个量等价于将坐标系变换一个相反的量。
事物是相对的,举个简单的例子,把a向+x平移1个单位,相当于坐标系往+x平移-1个单位。
-
平移变换
设点向量p = (p1,p2,p3,1)T,假设要往平移t(tx,ty,tz),则平移矩阵T为
在这里可以看出为什么方向向量的w要设为0,因为方向向量的平移没有意义, w设为0,平移矩阵T和方向向量相乘后,方向向量向量没有影响。而点向量的平移是有意义的,所以w设为1
-
仿射变换
仿射变换是指线性变换后接着平移。所以仿射变换是线性变换的超集。任何线性变换都是仿射变换。
3.旋转变换
2d的旋转证明:
假设这是一个单位圆(半径为1,圆心在原点)
假设逆时针为正方向
列向量p,q的关于原点逆时针旋转 θ 的矩阵:
R=
绕x轴旋转
Rx(a) =
绕y轴旋转
Ry(a) =
绕z轴旋转
Rz(a) =
绕任意轴旋转
解决思路是把绕任意轴旋转转化为在垂直于该轴的平面旋转。
下面的公式是建立在(左手坐标系)绕任意轴旋转的公式
绕一点旋转
假设绕z轴旋转,旋转中心是p,相当于把p平移到原点,在原点旋转,再平移回原来的位置
Rp = T(p) * Rz(a) * T(-p)
3D坐标系的方向
左手法则:
在左手坐标系中,伸出左手,大拇指指向旋转轴的正方向,四指弯曲的方向就是旋转的正方向。右手坐标系类似,不过用右手代替左手。
4.缩放变换
通过比例因子k来缩放矩阵,如果在各个方向都是同比例的缩放,称为均匀缩放。
缩放矩阵
S(s) =
如果均匀缩放的话,还可以只修改(3,3)位置处的数值,如下:
S(s) = =
5.错切变换
这类错切变换来在游戏中扭曲整个场景,可以产生某种虚幻效果,或者通过抖动来产生模糊反射效果。
错切有6个基本方式:Hxz,Hxy,Hyx,Hyz,Hzx,Hzy,第一个下标表示由错切矩阵改变的坐标,第二个下标表示进行错切操作的坐标。
例:Hxz(s)=, p=(px,py,pz,1)T 和矩阵相乘后得:(px+spz,py,pz,1)T
6.变换级联
矩阵乘法不存在交换性,要注意先后顺序,多个变换矩阵级联成一个矩阵,会有更好的效率。
7.刚体变换
仅由平移和旋转两种级联所组成的变换称为刚体变换。刚体变换也称为正规变换,所有的刚体变换都是正交,等角,可逆和仿射的。刚体变换具有长度和角度不变的特性。
8.法线变换
变换几何图形的矩阵为M,用矩阵N来变换该几何图形的法线:
N=(M-1)T
9.可逆变换
如果存在一个逆变换可以撤销原变换,则该变换是可逆。基本变换中,除了投影以外,其他变换都可以撤销。
10.等角变换
如果变换前后两向量夹角的大小和方向都不改变,该变换是等价的。平移,旋转,和均匀缩放时等角变换
11.正交变换
轴保持互相垂直,而且不进行缩放变换。
12.欧拉变换
欧拉角的基本思想是将角位移分解为绕三个互相垂直的三个旋转组成的序列。
欧拉角系统之一:Heading-pitch-roll 约定
一般情况是heading是y轴方向。面部为z的负方向。当使用欧拉角时候,会出现万向锁(Gimbal Lock)
欧拉角的优点:
容易使用,三个数都是角度
简洁
任意三个数都是合法。
缺点:
给定方位的表达方式不唯一
两个角度间求插值非常困难
13.镜像变换
使镜像因子为-1
P(n) = S(n,-1)
矩阵分解
四元数:
四元数:p = [w,v],p=[w,(x,y,z)]两种表示方式都可以。标量w和向量v
四元数有三个虚部i,j,k,一个实部。
性质如下:
i2 = j2 = k2,
ij = k ,ji= -k,jk= i,
Kj = -i, ki = j,ik = -j;
共轭和逆
q* =[w,v] = [w,-v];
q-1 = q* / ||q||,
假设q是单位四元数,那四元数的模||q||=1,所以q* = q-1
乘法:
[w1,v1][w2,v2] = [w1w2-v1v2, w1v2+w2v1 + v2 x v1]
单位四元数:长度为1的四元数
三维旋转中四元数的表示:
q = [cos (a/2), sin (a/2)n]
q = [cos (a/2), sin (a/2)nx, sin (a/2)ny, sin (a/2)nz]
执行以下乘法可以使3D点四元数p 绕n旋转:
p=qpq-1=qpq*
多次旋转
P=r(qpq-1)r-1=(rq)p(q-1r-1)=(rq)p(rq)-1=(rq)p(rq)*
q的任何非零实倍数都表示同一个变换,q和-q表示相同的旋转
球面线性插值(slerp)
可以在两个四元数之间平滑插值,避免了欧拉角的问题。
投影
投影意味着降维。投影有正交投影,透视投影。
正交投影,假设把p(x,y,z,w)投影到z=0的平面上,矩阵为:
透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失,成为灭点。它的视景体类似于一个顶部和底部都被切除掉的棱椎,也就是棱台