圖形學中中對於矩陣常涉及的操作有以下幾種:
- 縮放
- 旋轉
- 平移
在介紹為什么要引入齊次坐標之前先介紹這三個操作的線性代數的表達形式。為了說明方便以二維進行舉例說明。
縮放
假設有一個向量為\([x1,y1]\),那么如果要使得沿着x軸和y軸方向分別伸縮\(k_x,k_y\)倍,寫成矩陣的形式如下:
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} k_x & 0\\ 0 & k_y\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{equation} \]
旋轉
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} cos\theta & -sin\theta\\ sin\theta & cos\theta\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]} \end{equation} \]
平移
平移很好理解,即
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} x1\\ y1\\ \end{array} \right ]}+{ \left[ \begin{array}{ccc} tx\\ ty\\ \end{array} \right ]} \end{equation} \]
但是我們可以看到只有平移的運算是加法,而旋轉和縮放都是矩陣乘法,如果平移也能用乘法表示的話,我們就可以通過矩陣連乘的方式很方便的對矩陣做旋轉、平移和縮放操作了,所以也就引入了齊次坐標的概念。
齊次坐標
引入齊次坐標其實就是升維,將圖像從平面2D坐標變成3D坐標。我們看看平移變換在三維中的矩陣形式:
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} 1 & 0 & tx\\ 0 & 1 & ty\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{equation} \]
可以看到公式4和公式3的結果是一樣的,所以我們成功地將平移的加法運算變成了乘法運算,那旋轉和縮放放到三維后的矩陣乘法還成立嗎?
縮放:
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} k_x & 0 & 0\\ 0 & k_y & 0\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{equation} \]
旋轉:
\[\begin{equation} { \left[ \begin{array}{ccc} x2\\ y2\\ 1\\ \end{array} \right ]}={ \left[ \begin{array}{ccc} cos\theta & -sin\theta & 0\\ sin\theta & cos\theta & 0\\ 0 & 0 & 1\\ \end{array} \right ]}{ \left[ \begin{array}{ccc} x1\\ y1\\ 1\\ \end{array} \right ]} \end{equation} \]
上面兩個式子的結果和二維矩陣乘法結果保持一致,所以通過引入齊次坐標我們將三個基本操作統一起來了,以后所有的變換,不管怎樣變換,變換多少次,都可以表示成一連串的矩陣相乘了,這是多么的方便。這就是引入齊次坐標的作用,把各種變換都統一了起來。
參考: 為什么要引入齊次坐標