1. 程式人生 > >從0開始的圖形學大師(5~未完)

從0開始的圖形學大師(5~未完)

從0開始的圖形學大師

標籤(空格分隔):圖形學 peter Shirley <計算機圖形學>


第5章 線性代數

大學知識。

三維行列式為平行六面體體積,體積為零,共面,線性相關。

特徵向量不相等為正交。對稱矩陣特徵值是實數。

第6章 矩陣變換

##6.1 基本二維變換

  • 縮放

[ s

x 0 0 s
y
] \begin{bmatrix} s_x &amp; 0\\ 0 &amp; s_y \end{bmatrix}

  • 切變

[

1 s s 1 ] \begin{bmatrix} 1&amp;s_{水平}\\ s_{垂直}&amp;1 \end{bmatrix}

圓在這時候會變換成橢圓

對切變的另一種解釋是,相對垂直軸(水平軸)做旋轉。
[ 1 t a n ϕ t a n ϕ 1 ] \begin{bmatrix} 1&amp;tan\phi_{垂直軸}\\ tan\phi_{水平軸}&amp;1 \end{bmatrix}

  • 旋轉(預設逆時針)

[ c o s ϕ s i n ϕ s i n ϕ c o s ϕ ] \begin{bmatrix} cos\phi&amp;-sin\phi\\ sin\phi&amp;cos\phi \end{bmatrix}

旋轉矩陣是正交矩陣

  • 反射

Y [ 1 0 0 1 ] X [ 1 0 0 1 ] Y軸反射 \begin{bmatrix} -1&amp;0\\ 0&amp;1 \end{bmatrix} X軸反射 \begin{bmatrix} 1&amp;0\\ 0&amp;-1 \end{bmatrix}

  • 二維變換組合與分解

組合沒啥好說的,就是矩陣相乘。

分解(旋轉-縮放-旋轉)就是奇異值分解

分解(多個切變)沒說,在光柵旋轉時很有用。

6.2 基本三維變換

###6.2.1 任意三維旋轉

如果想繞任意向量a進行旋轉,可以先構造一個正交基w=a,把這個正交基旋轉到標準基,然後繞z軸進行旋轉,然後再把標準基旋轉回uvw基。

###6.2.2 法向量變換

法向量經過與曲面上的點相同的M變換後,可能不再與變換後的表面垂直。

因此法向量的變換不同於平面的變換。

經過推導p103,我們知道法向量的變換 N = ( m 1 ) T N = (m^{-1})^T

其實就是矩陣餘子式不轉置。(經常不轉置的我-,-)

##6.3 平移(視窗變換)

我們可以用高維的矩陣實現低維矩陣相同的變換

視窗變換可以用三次矩陣相乘

6.4 變換矩陣的逆

介紹了幾何方法求逆

6.5 座標變換

我們可以把點的變換變為座標系的變換

第7章 觀察

7.1 繪製標準視體

繪製2d標準視體進行的變換(為了適應畫素點而做的視窗變換),我們把畫素擴充套件成為一個1x1x1的立方體。
$$
\begin{bmatrix}

1&0&\frac{n_x-1}{2}\
0&1&\frac{n_y-1}{2}\
0&0&1

\end{bmatrix}

\begin{bmatrix}

\frac{n_x}{2}&0&0\
0&\frac{n_y}{2}&0\
0&0&1

\end{bmatrix}

\begin{bmatrix}

\frac{n_x}{2}&0&\frac{n_x-1}{2}\
0&\frac{n_y}{2}&\frac{n_y-1}{2}\
0&0&1

\end{bmatrix}

\begin{bmatrix}

\frac{n_x}{2}&0&0&\frac{n_x-1}{2}\
0&\frac{n_y}{2}&0&\frac{n_y-1}{2}\
0&0&1&0\
0&0&0&1

\end{bmatrix}
$$

7.2 正射投影

繪製3d標準視體進行的變換(相當於三維視窗變換)
$$
\begin{bmatrix}

\frac{2}{r-l}&0&0&0\
0&\frac{2}{t-b}&0&0\
0&0&\frac{2}{n-f}&0\
0&0&0&1

\end{bmatrix}

\begin{bmatrix}

1&0&0&-\frac{l+r}{2}\
0&1&0&-\frac{b+t}{2}\
0&0&1&-\frac{n+f}{2}\
0&0&0&1

\end{bmatrix}

\begin{bmatrix}

\frac{2}{r-l}&0&0&-\frac{l+r}{2}\
0&\frac{2}{t-b}&0&-\frac{b+t}{2}\
0&0&\frac{2}{n-f}&-\frac{n+f}{2}\
0&0&0&1

\end{bmatrix}
x y 7.1 7.2 為了在正視投影(即xy平面)中畫投影,我們把7.1和7.2得到的矩陣合併。
M_0 =
\begin{bmatrix}

\frac{D-d}{A-a}&0&0&\frac{dA-Da}{A-a}\
0&\frac{E-e}{B-b}&0&\frac{eB-Eb}{B-b}\
0&0&\frac{F-f}{C-c}&\frac{fC-Fc}{C-c}\
0&0&0&1

\end{bmatrix}
$$

compute M0
for each line segment(ai,bi) do
	p = M0ai
	q = M0bi
	drawline(xp,yp,xq,yq)

7.3 透視投影

這時我們要用到之前的第4維座標,因為需要x,y中除z。實現的效果是把z=f上的點投影到與z=n一樣大小的平面,而z=n上的點不變。

我們給出結論,變換矩陣為:
M p = [ 1 0 0 0 0 1 0 0 0 0 n + f n f 0 0 1 n 0 ] M_p = \begin{bmatrix} 1&amp;0&amp;0&amp;0\\ 0&amp;1&amp;0&amp;0\\ 0&amp;0&amp;\frac{n+f}{n}&amp;-f\\ 0&amp;0&amp;\frac{1}{n}&amp;0 \end{bmatrix}
我們光看矩陣不知道有啥特點。我們試驗一下效果。
$$
M_p
\begin{bmatrix}
x\y\z\1
\end{bmatrix}

\begin{bmatrix}
x\y\z\frac{n+f}{n}-f\\frac{z}{n}
\end{bmatrix}
\underrightarrow{齊次化}
\begin{bmatrix}
\frac{nx}{z}\ \frac{ny}{z}\n+f-\frac{fn}{z}\1
\end{bmatrix}
$$
我們把[x,y,z,1]換成[x,y,n,1],其次化結果還是[x,y,n,1],說明z=n上的點沒有受到影響;我們把[x,y,z,1]換成[x,y,f,1],其次化結果是[nx/f,ny/f,f,1],說明z=f上的點被縮放了n/f倍;我們自然可以得出n<z<f上的點會縮放n/z倍;

由於齊次化可以消去任意常數,所以 M p M_p 可以乘以n。
M p = [ n 0 0 0 0 n 0 0 0 0 n + f n f 0 0 1 0 ] M_p = \begin{bmatrix} n&amp;0&amp;0&amp;0\\ 0&amp;n&amp;0&amp;0\\ 0&amp;0&amp;n+f&amp;-nf\\ 0&amp;0&amp;1&amp;0 \end{bmatrix}
最終的 M = M o M p M v M = M_oM_pM_v