1. 矩阵(Matrix)
1.1 矩阵和笛卡尔坐标系之间的关系
理解矩阵的关键点在于,我们要知道,矩阵的行就代表坐标系的一个轴(axis/ base),如果我们需要变换(transform)点或者向量从一个坐标系到另一个坐标系,我们只需要将心坐标系的每个轴的坐标放入矩阵的行中即可。
- 新坐标系的方向(orientation)由旋转部分决定(rotation)
- 新坐标系的大小(size)由伸缩部分决定(scale)
- 新坐标系的位置(position)由平移矩阵决定(translation)
如图所示:
如何去理解:
假设在 A 坐标系中有一个点 p,这时候我们将 p 绕着 z 轴旋转,我们先不去想它在 A坐标系 中的变化,而是假设有另一个坐标系(比方说 local coordinate system),而这个 local coord system 是和点 p 铆定的,p 怎么动,它也怎么动,所以 p 相对于 local coord system 的坐标是不变的。
一开始,A坐标系 和 local coord system 是重叠的,那么当 p 绕 A 坐标系的 z 轴旋转时, local coord system 做同样的旋转,而这个旋转矩阵每一行就分别对应了这个 local coord system 在 A 坐标系中的xyz轴。
1.2 正交矩阵(Orthogonal Matrix)
行和列正交的矩阵就是正交矩阵
特性:
转置矩阵(transpose)等于逆矩阵(inverse)
1.3 仿射变换(Affine Transformation)
所谓仿射变换,归根结底就是在变换过程中仍然能够保留直线。
因此,translation,rotation,shearing 都是仿射变换。
和仿射变换对应的是投射变换(projective transformation),透视投影(perspective projection)就是投射变换中的一种,很明显,这种变换不能保留直线的平行关系。
2. 点和矩阵的变换
2.1 齐次坐标系(Homogeneous Coordinates)
点的齐次坐标系是将三维坐标加上一个 w=1 作为第四项,得到[x, y, z, 1]
因此,变换矩阵需要加上[0,0,0,1]的第四列,但是,这不是唯一情况,因为在投影矩阵,错切矩阵中,第四列有可能是请他情况,最后得到变换后点的 w 也不再是1,这时,我们就需要将这个点进行透视分割(perspective divide),即,四项都除以w。
2.2 行/列主序向量(Row/Column Major Vector)
row major vector:
column major vector:
还有两个术语需要注意下,左乘/前乘(left/ pre-multiplication)和右乘/后乘(right/ post-multiplication)是指向量相对于矩阵的位置。
显然可见,如果是 row major vector,那么就是 left/ pre multiplication,如果是 column major vector,那么就是 right/ post multiplication。
关于这一点,Maya文档里面是使用错了的,千万注意。
2.3 行/列主序矩阵(Row/Column Major Matrix)
从数学角度上来讲,这两种矩阵并无差别,只是在表示时候 row major matrix 是 m[row][col],另一个是 m[col][row]. 他们的差别主要体现在计算机计算性能上.
row major matrix 存储时是按照行存储数据, 而 column major matrix 存储时是按照列顺序存储.
计算机cpu在访问一个值时,会将其后面的几个值也放在cache里面,以[3*1]*[3*3]这样一个 pre-multiplication 为例,每一次计算新向量中一个成员时是需要访问矩阵一个列, 采用 column major matrix 能显著优化性能.
2.4 创建一个方向矩阵/局部坐标系(Orientation Matrix/ Local Coordinate System)
我们通常也会称之为 TNB 坐标系,即 tangent bitangent normal,无论我们采用左手坐标系还是右手坐标系去将他们标注为 xyz 轴,只需要记住 normal 叉乘 tagent = bitangent。
TNB用世界坐标系表示的三个轴可以组成一个矩阵,这个矩阵乘以TNB坐标系内一个点的坐标就可以得到该点世界坐标。