线性变换
定义
数学函数 τ(v)=τ(x,y,z)=(x′,y′,z′),我们称τ 为线性变换(linear transformation),当且仅当该函数具有下列性质:
τ(u+v)τ(ku)=τ(u)+τ(v)=kτ(u)
其中 u 和v是任意三维向量,k为标量。
矩阵表示法
向量 u=(x,y,z) 可以写作
u=(x,y,z)=xi+yj+zk=x(1,0,0)+y(0,1,0)+z(0,0,1)
i,j和 k 称为 R3 的标准基向量 (standard basis vector)。设τ 为一种线性变换,能够得到
τ(u)=τ(xi+yj+zk)=uA=[x,y,z]⎣⎡A11A21A31A12A22A32A13A23A33⎦⎤
其中 τ(i)=(A11,A12,A13),τ(j)=(A21,A22,A23) 且τ(k)=(A31,A32,A33)。
缩放
缩放(scaling,又称比例变换),定义为
S(x,y,z)=(sxx,syy,szz)
缩放矩阵(scaling matrix)表示为
S=⎣⎡sx000sy000sz⎦⎤
其对应的逆矩阵为
S=⎣⎡1/sx0001/sy0001/sz⎦⎤
旋转
描述令向量 v 绕轴 n 以角度 θ 进行旋转,在沿 n 轴从上至下俯瞰时,按顺时针方向测量角θ,并假设∥n∥=1。
可得旋转的变换矩阵
Rn=⎣⎡cosθ+(1−cosθ)x2(1−cosθ)xy−sinθz(1−cosθ)xz+sinθy(1−cosθ)xy+sinθzcosθ+(1−cosθ)y2(1−cosθ)yz−sinθx(1−cosθ)xz−sinθy(1−cosθ)yz+sinθxcosθ+(1−cosθ)z2⎦⎤
旋转矩阵每个行向量都为单位长度且两两正交,即行向量都是 规范正交的 (orthonormal),并称其为 正交矩阵(orthogonal matrix)。它的逆矩阵与转置矩阵相等:
Rn−1=RnT=⎣⎡cosθ+(1−cosθ)x2(1−cosθ)xy+sinθz(1−cosθ)xz−sinθy(1−cosθ)xy−sinθzcosθ+(1−cosθ)y2(1−cosθ)yz+sinθx(1−cosθ)xz+sinθy(1−cosθ)yz−sinθxcosθ+(1−cosθ)z2⎦⎤
特别的,以 x、y、z 为旋转轴的对应旋转矩阵为:
Rx=⎣⎢⎢⎡10000cosθ−sinθ00sinθcosθ00001⎦⎥⎥⎤,Ry=⎣⎢⎢⎡cosθ0sinθ00100−sinθ0cosθ00001⎦⎥⎥⎤,Rz=⎣⎢⎢⎡cosθ−sinθ00sinθcosθ0000100001⎦⎥⎥⎤
仿射变换
齐次坐标
仿射变换(affine transformation)是由一个线性变换与一个平移变换组合而成的。平移变换只能应用于点,齐次坐标(homogeneous coordinate)所提供的表示机制,是我们可以方便地对点和向量进行统一的处理:
- (x,y,z,0)表示向量;
- (x,y,z,1)表示点。
仿射变换定义及其矩阵表示
仿射变换为一个线性变换加上一个平移向量b,即
α(u)=τ(u)+b
或使用矩阵表示法
α(u)=uA+b=[x,y,z]⎣⎡A11A21A31A12A22A32A13A23A33⎦⎤+[bx,by,bz]=[x′,y′,z′]
平移
将平移变换(translation transformation)定义为仿射变换,此时其中的线性变换是一种 恒等变换(identity transformation),即
τ(u)=uI+b=u+b
平移矩阵(translation matrix)为
T=⎣⎢⎢⎡100bx010by001bz0001⎦⎥⎥⎤
其逆矩阵为
T−1=⎣⎢⎢⎡100−bx010−by001−bz0001⎦⎥⎥⎤
缩放和旋转的仿射矩阵
缩放矩阵与旋转矩阵可以写作:
S=⎣⎢⎢⎡sx0000sy0000sz00001⎦⎥⎥⎤
Rn=⎣⎢⎢⎡cosθ+(1−cosθ)x2(1−cosθ)xy−sinθz(1−cosθ)xz+sinθy0(1−cosθ)xy+sinθzcosθ+(1−cosθ)y2(1−cosθ)yz−sinθx0(1−cosθ)xz−sinθy(1−cosθ)yz+sinθxcosθ+(1−cosθ)z200001⎦⎥⎥⎤
仿射变换矩阵的几何意义
刚体变换 (rigid body transformation)本质是一种保形(shape preserving)变换。设τ 为描述物体旋转操作的旋转变换,而 b 为定义物体平移操作的平移向量。那么,刚体变换就可以用仿射变换来表示:
α(x,y,z)=τ(x,y,z)+b=xτ(i)+yτ(j)+zτ(k)+b
坐标变换
不同标架间的坐标的转换称之为 坐标变换(change of coordinate transformation,译为坐标系变换或许更好)。
向量的坐标变换
设给定向量 p 在标架 A 中的坐标为 pA=(x,y,z),希望求得向量p 在标架 B 中的对应坐标pB,那么
pB=xuB+yvB+zwB
其中,u、v和 w 分别是指向标架 A 中x轴、y轴和 z 轴正方向上的单位向量。
点的坐标变换
如果点 p 在标架 A 中的坐标为pA=(x,y,z),那么
pB=xuB+yvB+zwB+QB
其中,u、v和 w 分别是指向标架 A 中x轴、y轴和 z 轴正方向上的单位向量,Q为标架 A 中的原点。
坐标变换的矩阵表示
使用齐次坐标,可用同一公式对点和向量进行处理:
(x′,y′,z′,w)=xuB+yvB+zwB+QB
上式可改写为矩阵形式:
[x′,y′,z′,w]=[x,y,z,w]⎣⎢⎢⎡uxvxwxQxuyvywyQyuzvzwzQz0001⎦⎥⎥⎤=xuB+yvB+zwB+wQB
我们把能把标架 A 中的坐标转换为标架 B 中的坐标的 4×4 矩阵,称为 坐标变换矩阵 (change of coordinate matrix)或 标架变换矩阵(change of frame matrix)。
标架变换映射都是可逆的,因此一定存在逆矩阵使标架 B 中的坐标转换为标架 A 中的坐标。
DirectXMath 库
DirectXMath 中与变换相关的函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| XMMATRIX XM_CALLCONV XMMatrixScaling (float ScaleX, float ScaleY, float ScaleZ); XMMATRIX XM_CALLCONV XMMatrixScalingFromVector (FXMVECTOR Scale);
XMMATRIX XM_CALLCONV XMMatrixRotationX (float Angle); XMMATRIX XM_CALLCONV XMMatrixRotationY (float Angle); XMMATRIX XM_CALLCONV XMMatrixRotationZ (float Angle); XMMATRIX XM_CALLCONV XMMatrixRotationAxis (FXMVECTOR Axis, float Angle);
XMMATRIX MX_CALLCONV XMMatrixTranslation (float OffsetX, float OffsetY, float OffsetZ); XMMATRIX MX_CALLCONV XMMatrixTranslationFromVector (FXMVECTOR Offset);
XMVECTOR MX_CALLCONV XMVector3TransformCoord (FXMVECTOR V, CXMMATRIX M);
XMVECTOR MX_CALLCONV XMVector3TransformNormal (FXMVECTOR V, CXMMATRIX M);
|