Tag DirectX下的博客主要用于记录DirectX的学习过程,主要参考《DirectX 12 3D 游戏实战开发》。本篇主要是顺着DX12龙书的节奏温习线性代数中的坐标变换。
坐标变换
坐标变换是坐标系变换的简称。在计算机图形学中,经常需要在不同的坐标系研究同一物体,这时就需要坐标系的变换。坐标变换的对象可以是点或者向量,这里的点指点的位置,对于这两者的坐标变换是有区别的,需要分开讨论。
向量的坐标变换
由于向量没有位置信息,故对向量的坐标变换可以把变换前后的坐标系平移至原点重合进行。
考虑向量p=(x,y)在二维坐标系A中,它可以用线性组合方式表示为: \(\vec{p}=x\vec{u_A}+y\vec{v_A}\) 其中,u、v是p坐标系A的基,上式写成线性组合的形式即: \(\vec{p}=[x,y]\times \begin{bmatrix} \vec{u_A}\\ \vec{v_A} \end{bmatrix}\) u、v通常是单位正交基。此时如果想改变研究的坐标系为B,那么在坐标系B下的p为: \(\vec{p}\prime=(x\prime,y\prime)=[x,y]\times \begin{bmatrix} \vec{u_B}\\ \vec{v_B} \end{bmatrix}\) 此时的u、v坐标为在坐标系B中的坐标。也就是说,如果已知原坐标系的各轴向基向量在待变换坐标系的向量表示,把这些基向量按行依次排列得到的矩阵即向量的坐标系变换矩阵。显然这一结论对高维坐标系转换也成立。3维向量的坐标系变换公式为: \(\vec{p_B}=x\vec{u_B}+y\vec{v_B}+z\vec{w_B}\)
点的坐标变换
点的坐标变换则有所不同,对点的平移会改变点的位置。那么,在对点进行坐标系变换的时候就需要加上相对偏移,这个偏移用向量V表示。假设变换前坐标系为A,待变换坐标系为B,点的坐标为p,在不考虑偏移时,点的坐标变换和向量一样: \(\vec{p_B}=x\vec{u_B}+y\vec{v_B}+z\vec{w_B}\) 显然,V为坐标系B的原点指向坐标系A的原点的向量,即: \(\vec{V}=O_A-O_B\) 由于是在变换后再加上偏移值,故上式应是坐标系B中的表示。那么,完整的点的坐标变换公式为: \(\vec{p_B}=x\vec{u_B}+y\vec{v_B}+z\vec{w_B}+\vec{V}\\ \vec{V}在各分量值上等于O_A\)
矩阵表示
\[\begin{aligned} &对向量来说,(x\prime,y\prime,z\prime)=x\vec{u_B}+y\vec{v_B}+z\vec{w_B} \\ &对点来说,\space\space\space(x\prime,y\prime,z\prime)=x\vec{u_B}+y\vec{v_B}+z\vec{w_B}+\vec{V} \\ \end{aligned}\]参照之前齐次坐标的内容,同样可以很容易地对这两种情况作统一处理。扩展第四维w,w为0表示向量,w为1表示点,同时把变换矩阵M扩展为四维齐次矩阵C: \(变换矩阵C= \begin{bmatrix} M&0\\ V&1 \end{bmatrix} = \begin{bmatrix} u_x&u_y&u_z&0\\ v_x&v_y&v_z&0\\ w_x&w_y&w_z&0\\ O_x&O_y&O_z&1 \end{bmatrix}\) 这个矩阵也很好理解,其中的每一行都是一个齐次坐标。前三行分别是原坐标系的基向量在待变换坐标系的齐次坐标,故其w值为0;第四行为偏移量,值相当于原坐标系原点在待变换坐标系的坐标,故其w值为1。
坐标变换矩阵的复合及其逆矩阵
坐标变换矩阵的复合本质上仍是矩阵的复合,只需按照给定的顺序从左到右计算即可得到最终坐标系下的点或向量的坐标。这里说明一点,这个系列是参考龙书的表示方法,即采用矩阵左乘行向量的方式表示变换,其实还可以先把代表点和向量的向量转置为列向量,然后用矩阵右乘再转置,得到的结果是一样的。
和普通的矩阵类似,一系列坐标变换矩阵的逆等于分别对各个矩阵求逆再反向相乘。这也很好理解,逆矩阵的工作就是“撤销”原先的变换,显然我们需要按逆序“撤销”之前施加的变换,也即: \(\vec{v}\times(M_1M_2...M_n)^{-1}=\vec{v}\times M_n^{-1}...M_2^{-1}M_1^{-1}\)