現代3D圖形編程學習-基礎簡介(1) (譯)

本書系列html

現代3D圖形編程學習編程

基礎簡介

並不像本書的其餘章節,這章內容沒有相關的源代碼或是項目。本章,咱們將討論向量,圖形渲染理論,以及OpenGL。學習

向量

在閱讀這本書的時候,你須要熟悉代數和幾何知識,但對於向量的理解並非必要的。由於,在接下去的內容中,會對向量的基本概念做出介紹。spa

在面對幾何或是數值相關的內容時,向量能夠有不少不一樣的解釋。在任何一種狀況,向量是具備維度的。二維的向量限制在一個平面上,然而三維的向量能夠在任何的物理空間。向量還能夠有更高的維度,可是一般狀況下,咱們處理的向量的維度只在二維到四維之間。3d

嚴格的來講,向量還能夠存在僅僅一維的狀況。這樣的向量被稱爲標量code

在幾何術語中,向量能夠表示兩個概念:一個空間中的位置或是一個方向。component

向量的位置表示空間中一個特殊的位置。如,在下圖中咱們有一個向量位置A。htm

figure 1 vector position Figure1 vector positionblog

向量也能夠表示爲方向。方向向量沒有一個原點;只用來表示空間中的方向。下圖中給出了不一樣的方向向量,其中B和D雖然畫在不一樣的位置,但它們是相同的方向向量。get

Figure2 Direction Vectors

對於幾何而言,以上的表達方式已經夠用了,可是向量還能夠被解釋成數值。這時候,一個向量表示爲一個數字序列,沒一個數字表示一個維度。所以,二維的向量有兩個數字;三維的向量有三個數字。對於四維向量也是同樣的。從數字上來講,標量僅僅是一個數字。

向量中的沒一個數字都被稱爲要素(component)。每個要素都有本身的名字。對於咱們而言,向量的第一個要素被成爲X,第二個被成爲Y,第三個是Z,第四個是W。

當用文本的方式來書寫向量的時候,它們一般被括號包圍。所以,一個3D向量能夠是(0,2,4),其中X爲0,Y爲2,Z爲4.當他們以公式的形式進行書寫的時候,表現形式爲:

\[ \vec {a} = \left[ \begin{matrix} 1 \\ 2 \\ 3 \end{matrix} \right] \]

在數學公式中,向量變量會以粗體或是上面帶箭頭的形式出現。

當在繪製向量的時候,須要區分位置向量和方向向量。可是,它們二者的數值並無區別。惟一的區別是你怎麼使用它們,而不是怎麼用數字表達它們。所以,你能夠把一個點考慮成一個向量,而後執行一些操做,最後再將它考慮成一個點。

雖然向量的各個成分之間是獨立的,可是數學公式操做它們的時候,它們是一個總體。在接下來的內容中,咱們會經過幾何和數值的方式展現一些操做。

向量加法 你能夠對兩個向量執行加法操做。從圖形上看是這樣的:

Figure3 Vector Addition

要記得的是,方向向量在不改變具體數值的狀況下,能夠對其進行移動。所以,若是你將兩個向量放置爲首位相接,向量的加法能夠簡單的表示成從第一個向量的尾部指向第二個向量的頭。

Figure4 Vector Addition Head-to-Tail

從數值上來說,兩個向量的求和就是將兩個向量的各個成分相加,

公式1. 向量相加
\[ \vec{a} + \vec{b} = \left[ \begin{matrix} a_x \\ a_y \\ a_z \end{matrix} \right] + \left[ \begin{matrix} b_x \\ b_y \\ b_z \end{matrix} \right] = \left[ \begin{matrix} a_x+b_x \\ a_y+b_y \\ a_z+b_z \end{matrix} \right] \]

一個操做須要對向量各個成分進行,被稱爲份量操做(component-wise operation)。向量加法就是一個份量操做。任何一個份量操做都須要保證兩個向量有相同的維度。

向量求反和減法 你能夠對一個向量去反,就是逆轉一個向量的方向。

Figure5 Vector Negation

從數值上來看,就是對向量中的每一個成分都去反。

公式2. 向量去反

\[-\vec{a}=-\left[\begin{matrix}a_x \\ a_y \\ a_z \end{matrix} \right]=\left[\begin{matrix} -a_x \\ -a_y \\ -a_z \end{matrix} \right]\]

正如數值運算,向量的減法就是一個向量和第二個向量的反進行相加。

Figure6 Vector Subtraction

向量乘法 向量乘法操做是向量操做中爲數很少的沒有幾何概念與之對應的操做。將兩個方向或是兩個位置進行相乘,並無什麼意義。但這並非說向量的乘法沒有做用。

數值上,向量的乘法,就是將對應的各個成分相乘。

公式3. 向量乘法

\[ \vec{a}*\vec{b}=\left[\begin{matrix} a_x \\ a_y \\ a_z \end{matrix}\right]*\left[\begin{matrix}b_x \\ b_y \\ b_z \end{matrix}\right]=\left[\begin{matrix} a_x*b_x \\ a_y*b_y \\ a_z*b_z \end{matrix}\right]\]

向量縮放操做 向量能夠乘以一個標量。這個標量僅僅是一個數值。更具這個標量的值,這個向量可能被放大或縮小。

Figure7 Vector Scaling

數值運算上,就是將向量的各個成分和標量進行相乘。

公式4. 向量縮放操做

\[ s*\vec{a}=a*\left[\begin{matrix} a_x \\ a_y \\ a_z\end{matrix}\right]=\left[\begin{matrix} s*a_x \\ s*a_y \\ s*a_z \end{matrix}\right] \]

標量也能夠和向量相加,這一樣沒有什麼幾何意義。公式以下:

公式5. 向量標量相加

\[s+\vec{a}=s+\left[\begin{matrix} a_x \\ a_y \\ a_z\end{matrix}\right]=\left[\begin{matrix}s+a_x \\ s+a_y \\ s+a_z \end{matrix}\right]\]

向量代數 理解這些向量操做之間的關係是有幫助的。

向量加法乘法遵循不少和標量加法乘法相同的規則。它們是交換率,結合率,和分配率。

公式6. 向量代數

  • 交換率:\(\vec{a}+\vec{b}=\vec{b}+\vec{a}\); \(\vec{a}*\vec{b}=\vec{b}*\vec{a}\)
  • 結合率:\(\vec{a}+\left(\vec{b}+\vec{c}\right)=\left(\vec{a}+\vec{b}\right)+\vec{c}\); \(\vec{a}*\left(\vec{b}*\vec{c}\right)=\left(\vec{a}*\vec{b}\right)*\vec{c}\)
  • 分配率:\(\vec{a}*\left(\vec{b}+\vec{c}\right)=\left(\vec{a}*\vec{b}\right)+\left(\vec{a}*\vec{c}\right)\)

向量和標量具備相似的特性。

長度. 向量也有長度,表示從起點到終點的距離。

公式7. 向量長度

\[ |\vec{a}|=\sqrt{a_x^2+a_y^2+a_z^2}\]

這裏使用了畢達哥拉斯定理來計算向量的長度。這個適用於任何維度的向量,並不僅僅是二維或三維向量。

單位向量與標準化 一個向量的長度爲一,那麼這個向量是 單位向量 。在數學公式中單位向量的表示方式是在變量名上面加個^。

一個向量轉變成單位向量的過程叫作 標準化 。將向量除以改向量的長度就可以獲得它的長度。

公式8. 向量標準化

\[\hat a=\frac{1}{|\vec{a}|}*\vec{a}=\left[\begin{matrix} \frac{a_x}{|\vec{a}|} \\ \frac{a_x}{|\vec{a}|} \\ \frac{a_x}{|\vec{a}|} \end{matrix}\right]\]

這些並非本書中用到的全部的向量操做。新的向量操做會在它們第一次被使用到的時候進行介紹。而且,並不像這裏使用到了公式,它們中的大多數將不是針對各個成分的獨立操做。

範圍符號 本書中會使用標準的標識來標記一個值的具體範圍。

若是一個值在0~1之間,而且能夠等於0和1,那麼標記爲[0, 1]。放括號表示範圍包括了相鄰的值。

若是一個值在0~1範圍,但不包括0,那麼標記爲(0, 1]。圓括號表示相鄰的值並不包括在範圍內。

若是一個值表示0和大於0的任何數值,那麼標記爲\([0, \infty)\),須要注意的是無窮大是不可達到的,所以它老是被排除在範圍以外的。任何一個小於0的範圍則標記爲\((-\infty,0)\)

相關文章
相關標籤/搜索