變換矩陣

變換矩陣（transformation matrix）是數學線性代數中的一個概念。線性變換採用矩陣表示時，如果T是一個把Rn映射到Rm的線性變換，且x是一個具有n個元素的column vector，那麼

$$T( \vec x ) = \mathbf{A} \vec x$$

我們把m×n的矩陣A，稱為T的變換矩陣。

## 應用

任意線性變換都可以用矩陣表示為易於計算的一致形式，並且多個變換也可以很容易地通過矩陣的相乘連接在一起。

線性變換不是唯一可以用矩陣表示的變換。Rn維的仿射變換與透視投影都可以用齊次坐標表示為RPn+1維（即n+1維的真實投影空間）的線性變換。因此，在三維電腦圖形學中大量使用著4x4的矩陣變換。

## 尋找變換矩陣

如果已經有一個函數型的線性變換$T (x)$，那麼通過T對標準基每個向量進行簡單變換，然後將結果插入矩陣的列中，這樣很容易就可以確定變換矩陣A，即

$$\mathbf{A} = \begin{pmatrix} T( \vec e_1)& T(\vec e_2 ) & \cdots & T( \vec e_n ) \end{pmatrix}$$

例如，函數$T (x) = 5x$是線性變換，通過上面的過程得到（假設n = 2）

$$T( \vec x ) = 5 \vec x = \begin{pmatrix} 5 && 0 \\ 0 && 5 \end{pmatrix} \vec x$$

## 在二維圖形中的應用示例

最為常用的幾何變換都是線性變換，這包括旋轉、縮放、切變、反射以及正投影。在二維空間中，線性變換可以用2×2的變換矩陣表示。

### 旋轉

繞原點逆時針旋轉 θ 度角的變換公式是 $x' = x \cos \theta -y \sin \theta$ 與 $y' = x \sin \theta + y \cos \theta$，用矩陣表示為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos \theta & -\sin\theta \\ \sin \theta & \cos \theta \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

### 縮放

縮放（反矩陣）公式為 $x' = s_x \cdot x$ 與 $y' = s_y \cdot y$，用矩陣表示為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} s_x & 0 \\ 0 & s_y \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

### 平移

平移有兩種可能的形式：

平行於 x 軸的推移為 $x' = x + ky$ 與 $y' = y$，矩陣表示為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} 1 & k \\ 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

平行於 y 軸的推移為 $x' = x$ 與 $y' = y + kx$，矩陣表示為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ k & 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

### 反射

為了沿經過原點的直線反射向量，假設（ux, uy）為直線方向的單位向量。變換矩陣為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} 2 u_x^2 - 1 & 2 u_x u_y \\ 2 u_x u_y & 2 u_y^2 - 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

不經過原點的直線的反射是仿射變換，而不是線性變換。

若一座標（x, y）沿直線 $y = (\tan \theta) \cdot x$ 進行反射，則其影像（x', y'）可用以下公式求得：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} \cos 2\theta & \sin 2\theta \\ \sin 2\theta & -\cos 2\theta \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

### 正投影

為了將向量正投影到一條經過原點的直線，假設（ux, uy）是直線方向的單位向量，變換矩陣為：

$$\begin{pmatrix} x' \\ y' \end{pmatrix} = \begin{pmatrix} u_x^2 & u_x u_y \\ u_x u_y & u_y^2 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix}$$

跟反射一樣，正投影到一條不經過原點的直線的變換是仿射變換，而不是線性變換。

平行投影也是線性變換，也可以用矩陣表示。但是透視投影不是線性變換，必須用齊次坐標表示。

## 組合變換與逆變換

用矩陣表示線性變換的一個主要動力就是可以很容易地進行組合變換以及逆變換。

組合可以通過矩陣乘法來完成。如果A與B是兩個線性變換，那麼對向量x先進行A變換，然後進行B變換的過程為：

$$\mathbf{B}(\mathbf{A} \vec x ) =(\mathbf{BA}) \vec x$$

換句話說，先A後B變換的組合等同於兩個矩陣乘積的變換。需要注意的是先A後B表示為BA而不是AB。

能夠通過兩個矩陣相乘將兩個變換組合在一起這樣的能力就使得可以通過逆矩陣進行變換的逆變換。A −1表示A的逆變換。

變換矩陣並不都是可逆的，但通常都可以進行直觀的解釋。在上一節中，幾乎所有的變換都是可逆的。只要$s_x$與$s_y$都不為零，那麼縮放變換也是可逆的。另外，正投影永遠是不可逆的。

## 其它類型的變換

### 仿射變換

為了表示仿射變換，需要使用齊次坐標，即用三維向量（x, y, 1）表示二維向量，對於高維來說也是如此。按照這種方法，就可以用矩陣乘法表示變換。$x' = x + t_x$; $y' = y + t_y$變為

$$\begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \\ 1 \end{pmatrix}$$

在矩陣中增加一列與一行，除右下角的元素為1外其它部分填充為0，通過這種方法，所有的線性變換都可以轉換為仿射變換。例如，上面的旋轉矩陣變為

$$\begin{pmatrix} \cos \theta & - \sin \theta & 0 \\ \sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{pmatrix}$$

通過這種方法，使用與前面一樣的矩陣乘積可以將各種變換無縫地集成到一起。

當使用仿射變換時，齊次坐標向量w從來不變，這樣可以把它當作為1。但是，透視投影中並不是這樣。

### 透視投影

三維電腦圖形學中另外一種重要的變換是透視投影。與平行投影沿著平行線將物體投影到圖像平面上不同，透視投影按照從投影中心這一點發出的直線將物體投影到圖像平面。這就意味著距離投影中心越遠投影越小，距離越近投影越大。

最簡單的透視投影將投影中心作為坐標原點，z = 1作為圖像平面，這樣投影變換為$x' = x / z$; $y' = y / z$，用齊次坐標表示為：

$$\begin{pmatrix} x_c \\ y_c \\ z_c \\ w_c \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 \end{pmatrix} \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix}$$

(這個乘法的計算結果是$(x_c, y_c, z_c, w_c)$ = $(x, y, z, z)$。）

在進行乘法計算之後，通常齊次元素wc並不為1，所以為了映射回真實平面需要進行齊次除法，即每個元素都除以wc：

$$\begin{pmatrix} x' \\ y' \\ z' \end{pmatrix} = \begin{pmatrix} x_c / w_c \\ y_c / w_c \\ z_c / w_c \end{pmatrix}$$

更加複雜的透視投影可以是與旋轉、縮放、平移、切變等組合在一起對圖像進行變換。