Chapter 3 TRANSFORMATIONS

本章的数学部分只总结结论,具体过程会总结在别的文章

几何变换的例子有平移、旋转和缩放。在这一章中,我们建立了矩阵方程,它可以用来转换三维空间中的点和向量。

目的:

  1. 了解如何用矩阵表示线性和仿射变换。
  2. 学习用于缩放、旋转和转换几何图形的坐标转换。
  3. 了解如何通过矩阵-矩阵乘法将多个变换矩阵组合成一个净变换矩阵。
  4. 找出如何将坐标从一个坐标系转换到另一个坐标系,以及如何用矩阵表示坐标变换的变化。
  5. 熟悉用于构造转换矩阵的DirectX数学库提供的函数子集。

3.1线性变换

3.1.1定义

一个函数输入一个三维向量,输出一个三维向量。称作为线性变换。

3.1.2矩阵表示

参考线性代数

3.1.3缩放

如图

左侧是原始目标,中间的是Y轴缩放,最右侧是X轴缩放

通过下面的式子来定义缩放变换:

S(x, y, z) = (sxx, syy, szz)

缩放变换是相对于坐标原点的,按照三个轴上的单位向量进行。

.o,sz .O) = 
.l,sz 
y o,sz 
s(k)

换成矩阵表示就是

s 
O 
0 
o 
o 
o

我们称这个矩阵是缩放矩阵

该矩阵的逆矩阵为

l/sx

举个例子:

假设目前有一个矩形,左下角点为(-4,-4,0),右上角为(4,4,0),是一个位于xoy面上的正方形。对该矩形在x轴上缩放0.5个单位,在y轴缩放2.0个单位,z轴不变,对应的缩放矩阵是:

0.5 
o

对两个点进行缩放运算

0.5 
[-4,궈,이 0 
0 
0 
2 
0 
0 
0 =[-2,-8,0] [4,4,0] 
0.5 
0 
0 
0 
0 
20 =[2,8,이 
0 
1
Scaling: 
(4, 4,0) 
-8,0)

3.1.4旋转

在这个部分,描述了一个向量v绕着坐标轴n旋转一个θ角。注意,测量的角度是向下看n轴的顺时针方向的角度,假设n的模=1。

旋转的矩阵表示如下:

o 
O 
coso 
—sin O 
sin 0 
coso 
coso 
sin O 
o 
O 
—sin O 
coso 
coso 
—sin 0 
sin O 
coso 
o 
o 
1 
o 
o 
o 
o 
1

举个例子:

我们定义一个左下角坐标为(-1,0,-1),右上角为(1,0,1)的矩形。要求将其绕Y轴顺时针旋转-30度(即逆时针30度),对应的Y轴旋转矩阵为:

coso 
sin O 
o 
O 
—sin O 
coso 
cos( 
sin ( 
-300) 
-300) 
O —sin (—30 ) 
o 
I 
0

将举行的两个点坐标与旋转矩阵相乘可以得到:

3.2仿射变换

此部分总结在其他文章

3.3 Composition of Transformation

成分转换

假设S是一个缩放矩阵,R是一个旋转矩阵,T是一个位移矩阵。假设有一个cube,是由八个向量Vi所确定的,如果要将三个变换依次应用于每个顶点,最简单的办法是一步一步来。但是由于矩阵乘法有结合律,所以可以简化,求出一个矩阵C,使C满足C=SRT。如下:

for
v, (SRT)zv,"' for i

可以将矩阵C看作三个变换封装的一个净变换矩阵。

这对性能有很重要的影响,比如假设有20000个点的某个对象,不用封装矩阵的话,会需要进行20000*3次的矩阵乘法运算,使用组合之后的矩阵只需要进行20000次。

再次注意:是结合律,绝对是没有交换律的。

3.4坐标变换

同一个向量在不同的坐标系有不同的相对于坐标系的坐标。计算机图形学中经常使用多个坐标系,所以需要知道如何在坐标系之间转换。位置不是向量的属性,是点的属性,所以坐标系变换是针对点的。

3.5变换矩阵与坐标系变换

其实在数学上,对一个对象进行的变换(平移,旋转,缩放等)和坐标系的变换是等价的。一个主动的变换可以被视为坐标系转换的变化。

3.6 DIRECTX数学变换函数


// Constructs a scaling matrix: 构造一个缩放矩阵
XMMATRIX XM_CALLCONV XMMatrixScaling( float ScaleX, float ScaleY, float ScaleZ);

// Constructs a scaling matrix from components in vector:从向量中的分量构造一个缩放矩阵
XMMATRIX XM_CALLCONV XMMatrixScalingFromVector( FXMVECTOR Scale);

// Constructs a x-axis rotation matrix Rx: 构造一个x轴旋转矩阵,顺时针旋转
XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle);

// Constructs a y-axis rotation matrix Ry: 构造一个y轴旋转矩阵,顺时针
XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle);

// Constructs a z-axis rotation matrix Rz: z轴,顺时针
XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle);

// Constructs an arbitrary axis rotation matrix Rn: 构造任意轴旋转矩阵,第一个参数是轴所对应的向量,第二个参数是顺时针角度
XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle);

//Constructs a translation matrix: 平移矩阵
XMMATRIX XM_CALLCONV XMMatrixTranslation( float OffsetX, float OffsetY, float OffsetZ);

//Constructs a translation matrix from components in a vector: 从向量的分量构造平移矩阵
XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector( FXMVECTOR Offset);

// Computes the vector-matrix product vM where vw = 1 for transforming points: 计算向量矩阵乘积vM,其中vw = 1表示转换点
XMVECTOR XM_CALLCONV XMVector3TransformCoord( FXMVECTOR V, CXMMATRIX M);

// Computes the vector-matrix product vM where vw = 0 for transforming vectors:计算向量矩阵乘积vM,其中vw = 0表示向量的变换
XMVECTOR XM_CALLCONV XMVector3TransformNormal( FXMVECTOR V, CXMMATRIX M);

3.7总结

1、基本变换矩阵——缩放、旋转和平移——由下列形式给出:

2、我们用4×4矩阵来表示变换,用1×4齐次坐标来描述点和向量,其中我们通过设置第四个分量为w = 1来表示一个点,通过设置w = 0来表示一个向量。这样,平移作用于点而不是向量。

关于为什么要使用4*4矩阵的原因

为什么directX里表示三维坐标要建一个4*4的矩阵?

3、如果一个矩阵的所有行向量都是单位长度并且相互正交,那么这个矩阵就是正交的。一个正交矩阵的特殊性质是它的逆等于它的转置,从而使得逆的计算简单而有效。所有的旋转矩阵都是正交的。

4. 根据矩阵乘法的结合律,我们可以将多个变换矩阵合并成一个变换矩阵。

5、如果矩阵M将坐标系A映射到坐标系B中,那么矩阵M的逆矩阵将坐标系B映射到坐标系A中。

6、主动变换可以解释为坐标变换的变化,反之亦然。对于某些情况,更直观的做法是使用多个坐标系统,并在对象保持不变但其坐标表示方式发生变化的系统之间进行转换,因为它是相对于不同的参照系进行描述的。