OpenGL Transform¶
矩陣組合¶
多個變換矩陣可以用乘法融合到一個矩陣中。例如,先縮放兩倍、再位移\((1,2,3)\) 矩陣乘法是從最右邊開始,依序往左乘,所以是最右邊的操作最先發生。
\[
Trans . Scale = \begin{bmatrix} \color{red}1 & \color{red}0 & \color{red}0 & \color{red}1 \\ \color{green}0 & \color{green}1 & \color{green}0 & \color{green}2 \\ \color{blue}0 & \color{blue}0 & \color{blue}1 & \color{blue}3 \\ \color{purple}0 & \color{purple}0 & \color{purple}0 & \color{purple}1 \end{bmatrix} . \begin{bmatrix} \color{red}2 & \color{red}0 & \color{red}0 & \color{red}0 \\ \color{green}0 & \color{green}2 & \color{green}0 & \color{green}0 \\ \color{blue}0 & \color{blue}0 & \color{blue}2 & \color{blue}0 \\ \color{purple}0 & \color{purple}0 & \color{purple}0 & \color{purple}1 \end{bmatrix} = \begin{bmatrix} \color{red}2 & \color{red}0 & \color{red}0 & \color{red}1 \\ \color{green}0 & \color{green}2 & \color{green}0 & \color{green}2 \\ \color{blue}0 & \color{blue}0 & \color{blue}2 & \color{blue}3 \\ \color{purple}0 & \color{purple}0 & \color{purple}0 & \color{purple}1 \end{bmatrix} \\
\begin{bmatrix} \color{red}2 & \color{red}0 & \color{red}0 & \color{red}1 \\ \color{green}0 & \color{green}2 & \color{green}0 & \color{green}2 \\ \color{blue}0 & \color{blue}0 & \color{blue}2 & \color{blue}3 \\ \color{purple}0 & \color{purple}0 & \color{purple}0 & \color{purple}1 \end{bmatrix} . \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = \begin{bmatrix} \color{red}2x + \color{red}1 \\ \color{green}2y + \color{green}2 \\ \color{blue}2z + \color{blue}3 \\ 1 \end{bmatrix}
\]
不同的操作之間可能相互影響,依照縮放、旋轉、位移的順序組合矩陣,否則操作間會相互影響
\[
M_{\text{transform}} = M_{\text{Translate}} \cdot M_{\text{Rotate}} \cdot M_{\text{Scale}}
\]
GLM¶
OpenGL Mathematics,是一個 header-only 的 OpenGL 數學函式庫
1 2 3 4 5 6 |
|
- 縮放 0.5 倍,逆時針選轉 90 度
1 2 3 |
|
Danger
最後在把 trans
跟點座標相乘時,是靠右的矩陣先跟點相乘,所以操作會是相反的
在製作 trans
時是先旋轉再縮放,但是對於該點座標是先縮放再旋轉。
- 修改 Vertex Shader ,新增
mat4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
- 將矩陣傳到 Vertex Shader
1 2 |
|