Objectives
1、理解如何用矩阵去表达线性(linear)和仿射(affine)变换。
2、学习坐标系变换,如缩放、旋转。
3、发现几个变换矩阵可以通过矩阵乘法转换成一个变换网络。
4、发现如何转换坐标系从一个坐标系到另外一个。怎么去用矩阵描述这样的坐标系变换。
5、熟悉DirectXMath库提供的函数来构造变换矩阵。
线性变换
考虑一个函数对于
τ(v)
,若其满足以下:
那么我们说这个函数是一个线性变换。
矩阵拓展
给定一个向量
u=(x,y,z)
,我们可以写成这样的形式。
其中 i,j,k 为标准基向量( standard basis vectors)。
故,我们有这样的结论:
所以,我们可以写成向量-矩阵乘法的形式。
我们可以说:矩阵A是线性变换 τ 的矩阵表达。
缩放
我们定义缩放像这样:
可以很容易的看出来, S 是线性的。所以我们把他写成向量-矩阵相乘的形式。
旋转
从上图可以推导出:
接下来就是将其转化为线性变换矩阵模式,将单位向量代入即可。
令 c=cosθ,s=sinθ 得出
可以发现旋转矩阵所有行向量的长度为1,且相互正交。
所以他的逆矩阵就等于转置矩阵。
这对于计算机的运算来说是非常效率的。
仿射变换
齐次坐标系(Homogeneous Coordinates)
因为我们对于向量只能表示方向或点,无法表达位移(translation)。换句话说,向量在进行位移时,不应该被改变。而齐次坐标系提供了一个方便的表达方式,来让我们同时表达向量和点。利用齐次坐标,我们使用4次来区分:
1、
(x,y,z,0)
表达向量
2、
(x,y,z,1)
表达点
定义和矩阵表达
一个线性变换不能表达我们所有的变换。因此,我们增加一个向量:
如果我们增加齐次坐标 w=1 ,我们可以写的更方便,如:
则这个4x4的矩阵被称为 仿射变换的矩阵表达形式。
位移
仿射矩阵下的缩放和旋转
如果
b=0
,则仿射变换可以归纳为线性变换。
缩放和旋转的4x4仿射矩阵表达:
坐标系之间的转换
对于点:
对于向量:
那么在齐次坐标系中,我们可以将他们表达在一起:
如果 w=0 ,则为向量的表达形式,否则为点。
Direct Math Transformation Functions
XMMATRIX XM_CALLCONV XMMatrixScaling(float ScaleX,float ScaleY,float ScaleZ);//构造一个缩放矩阵
XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale); // Scaling factors (sx,sy,sz)
XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle); //构造一个绕X轴旋转矩阵
XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle);//构造一个绕Axis旋转Angle的矩阵
XMMATRIX XM_CALLCONV XMMatrixTranslation(float OffsetX,float OffsetY,float OffsetZ);//构造一个平移
XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset);
XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, CXMMATRIX M); //V_w = 1;
XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, CXMMATRIX M);//V_w = 0;