[計算機圖形學]視圖變換:MVP變換、視口變換

1、MVP變換

MVP變換是模型變換(M)、視角變換(V)、投影變換(P)的統稱。MVP變換操做的是三維空間中的點,通過MVP變換後會被映射到標準二維平面上(實際上這個標準二維平面仍保留了z軸座標)。ui

1. 模型變換

模型變換在三維空間中對物體進行的操做,對三維物體自己進行縮放、旋轉、平移操做spa

注意,模型變換是相對於三維座標系(亦稱世界座標系)的原點進行的!
特別地,當須要繞物體中心旋轉時,須要將物體中心移動到原點,而後進行相應操做,操做完成後再移動回去(用矩陣描述爲:\(M = M_t^{-1} \cdot M_s \cdot M_r \cdot M_t\),而後與點進行操做,\(Point_N = M \cdot Point\))。
上述M矩陣的點乘順序是隨機的,同時也不是都須要的。同時你們能夠思考一下調換項的位置會發生什麼效果?.net

這裏,只給出縮放、旋轉、平移矩陣,不作解釋說明(若是想知道詳細過程,簡單)
下面列舉的公式與前面的沒有必然聯繫blog

1.1 縮放矩陣

\[ M_s = \begin{pmatrix} s_x & 0 & 0 & 0 \\ 0 & s_y & 0 & 0 \\ 0 & 0 & s_z & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \]

1.2 旋轉矩陣

參考文章:https://blog.csdn.net/csxiaoshui/article/details/65446125get

\[ M_{rx} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} M_{ry} = \begin{pmatrix} cos\theta & 0 & sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} M_{rz} = \begin{pmatrix} cos\theta & -sin\theta & 0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \]

1.3 平移矩陣

\[ M_t = \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \]

使用時,只須要帶入要變換的點(爲方便分析,這裏沒有給出放縮矩陣和平移矩陣)class

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = M_r \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} cos\theta & 0 & sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} cos\theta & -sin\theta & 0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} \]

若是你須要繞物體中心進行相應的操做(爲方便分析,這裏沒有給出放縮矩陣)
這裏的平移矩陣須要計算物體中心的座標,而後計算到三維空間座標系原點的距離
一樣,反平移矩陣計算過程相似mvp

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = M_t^{-1} \cdot M_r \cdot M_t \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 & -t_x \\ 0 & 1 & 0 & -t_y \\ 0 & 0 & 1 & -t_z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & cos\theta & -sin\theta & 0 \\ 0 & sin\theta & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} cos\theta & 0 & sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -sin\theta & 0 & cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} cos\theta & -sin\theta & 0 & 0 \\ sin\theta & cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & 0 & t_x \\ 0 & 1 & 0 & t_y \\ 0 & 0 & 1 & t_z \\ 0 & 0 & 0 & 1 \\ \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} \]

若是須要引入實際的平移矩陣,則變成
其中\(M_{tr}\)爲平移矩陣,\(M_t\)是經物體中心移動到座標原點自動添加的viewport

\[ \begin{pmatrix} x' \\ y' \\ z' \\ 1 \end{pmatrix} = M_{tr} \cdot M_t^{-1} \cdot M_r \cdot M_t \cdot \begin{pmatrix} x \\ y \\ z \\ 1 \end{pmatrix} \]

最後,若是須要再加上放縮矩陣,這個就不給出了(只須要知道將放縮矩陣放在不一樣的位置會有的含義就能夠了)移動

如下內容在單片機上基本上就不要奢求了,因此用到的不多,所以本文中再也不多作介紹,甚至也不會給出公式。
若是由興趣,歡迎一塊兒探討(liangzongnan0214@163.com)di

2. 視角變換

將三維空間座標系內的點映射到相機座標系中

須要給出相機所處的三維空間的位置、相機觀察點、相機向上方向(與相機位置和相機觀察點構成的連線垂直)
而後根據右手法則來創建相機座標系
在建系時,統一先歸一化到單位向量,由於只須要方向信息

至於如何將三維空間座標系映射到相機座標系,這裏給出一篇參考文章

參考文章:https://blog.csdn.net/silangquan/article/details/50987196

3. 投影變換

將相機座標系映射到標準的二維平面上(注意,這裏的z軸信息沒有丟失,正因如此,才能夠進行後續的着色、遮擋等工做)
只須要知道,投影變換包括正交投影和透視投影,透視投影的前期就是正交投影

參考文章:http://www.javashuo.com/article/p-vykizixx-pv.html

2、Viewport變換

Viewport變換隻作了一件事:將投影變換獲得的標準二維平面調整到顯示屏幕上 所以,Viewport變換本質是一個放縮+平移的過程