CG中的幾何學(點,向量以及法線)【1】

原文地址:http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/points-vectors-and-normals

(鄙人語言能力不強,只能翻譯成這樣了,已經是極限了~請謹慎食用-。-!)

提醒:
這篇文章可能稍顯枯燥乏味。如果您剛接觸計算機圖形學的話,請仔細閱讀本部分內容。完全掌握本章的內容將爲今後的計算機圖形學的學習起到事半功倍的效果。
Geometry
在計算機圖形學裏,點,向量,矩陣和法線的重要性就如同水之於人,這也是爲什麼大多數的計算機圖形學書籍都會以線性代數和幾何學作爲開始。然而,在沒有能夠用編程的方式在電腦屏幕上顯示畫面之前讓我們先學一大堆數學知識——簡直讓人感覺無聊。如果因爲對數學或者矩陣什麼的東西都不感興趣而導致您放棄學習計算機圖形學,那麼現在的這個系列教程將會改變你的想法。
我們會從3d渲染的基礎課程開始——請儘管放心,這些課程不需要您有很豐富的線性代數或是數學知識。我們會用一種非傳統的方式來教授計算機圖形學(以下簡稱CG)的知識,讓您在實踐中學習並體驗到快樂。比如,在介紹光線追蹤器的過程中,我們只會提到一點點數學以及編程知識,這樣任何人都能跟得上。寫渲染器將是一個非常讓人興奮的過程,在這個過程中你不僅能夠學到一些數學知識,還能夠知道我們是怎麼把事物顯示到屏幕上的。說了那麼多其實只需記住一點:點,向量以及矩陣是CG這棟建築的磚和瓦,我們會在不同的課程中經常和他們打交道。
在這篇教程中,我們會學到CG的磚和瓦是怎麼構成的以及我們能用什麼方式去操作它們。當然,我們也會順便介紹一些“俗語”。這些“俗語”已經在線性代數領域和CG領域被用了很多年。當上述領域的專家在解決它們的問題的時候,會經常使用這些俗語。因此,爲了和他們順利溝通(比如閱讀專家們的代碼什麼的),我們得在頭腦裏留下這些俗語的映像。
如果你是一個純粹的數學家,有可能你會發現這裏介紹的知識和線性代數的關係不是特別大。比如,嚴格來說:“點(point)“和線性代數是沒有關係的,因爲線性代數只用向量(Vector)。我們用”點“這個概念,僅僅是因爲它和CG有很強的關係,同時我們也能用線性代數中的知識來操作它們。後面我們將詳細的說明【點】和【向量】這兩種概念。

Vector
所以到底什麼是線性代數呢?就像我們之前提到的,是數學的一個分支,主要研究【向量】。也許現在你會問,到底什麼是向量,這些東西和CG到底有什麼關係?爲了貫徹之前的宗旨——我們只需要很少的數學知識!所以,我們不會介紹太多的細節,我們只會告訴您——向量可以用一組數來表示,僅此而已。這組數可以有任意多個數字。如果我們用n個數字來表示這個向量,那麼這個向量就是一個n維向量。可以用如下的方式表示:
v = (a ,b ,c ,d ,e ,f)
a ,b ,c ,d, e, f都是實數。
我們用這種方式來表示向量是有原因的,因爲這種方式可以很容易的幫我們解決CG中的問題。通常我們會用一個向量來表示CG中的位置和方向。我們也會用向量來改變物體的位置。現在,您只需要記住向量是這麼寫的就可以了。
Point and Vectors
點(point)和向量(vector)的概念在很多的領域都有用到,但在這裏,我們將它們倆限制在CG領域。
一個【點】可以用來表明三維空間中的一個位置。而【向量】通常表示三維空間中的方向。在三維空間裏面,它們有相同的表示:
V = (x ,y ,z)
x ,y , z都是實數。
數學家和物理學家頭腦中的點和向量的概念比CG中的更通用,我們這裏介紹的概念只在CG中適用。在CG裏面,【點】是沒有尺寸的。
這裏寫圖片描述
在這裏我們順便提一嘴【同質點(homogeneous point)】。什麼是同質點呢?有些時候爲了數學上的計算方便,我們會爲點的表示額外增加一個元素,像這樣:
P = {x,y,z,w}
當我們將點和矩陣做乘法的時候,就會用到同質點。現在您不需要了解什麼是點和矩陣的乘法,您只需要記住有這麼一種東西叫同質點就好,後面我們會詳細解釋的。

A quick introduction to Transformations(極速通關【變換】這個概念)
現在您可能對於點以及向量的【變換(Transformation)】到底是個什麼感到好奇。事實上這非常簡單。在CG裏面,我們經常對一個點進行的變換就是——移動。沒錯,我們需要將一個點從一個地方弄到另一個地方,這個過程就叫做變換(準確的說應該叫做移動變換)。
移動變換通常只是對原始點的一個線性移動。不過對向量來說,對她的移動變換通常沒有意義,因爲移動之後(中途不旋轉),向量所指的方向沒有發生變化。然而,如果我們對向量執行旋轉變換(也就是改變向量所指的方向),這就變得有意義了。現在,我們用如下的簡單公式來表示這兩種變換:
P->Translate->P’
V->Rotate->V’

到現在爲止我們並沒有提及向量的【長度】這一概念。在CG裏面,這很重要。一個長度爲1的向量,我們通常說它是normalized(單位化的)。我們通常所說的將一個向量單位化就是指在保持它的方向不變的前提下,改變它的長度爲1。大多數情況下,我們都會將向量單位化,不過有時候也不會這樣做,因爲我們會用向量的長度信息來計算某些值(比如亮點之間的距離)。

Normals【法線】
法線是用於描述一個面上某個點的朝向的向量。
這裏寫圖片描述
通常點的法線是與面上該點所在的切面垂直的向量。在模擬陰影的過程中,法線佔據着非常重要的地位。法線雖然也是一種向量,但是它們的變換方式和向量的並不同。這也是我們花時間來單獨說明兩者的原因。具體有何不同我們在後面會詳細說明。

是時候用代碼模擬概念了
我們使用C++代碼來模擬這些概念,當然我們並沒有嚴格的區分點和向量,它們都用一個叫做Vec3的類來表示:

template<typename T>
class Vec3
{
    public:
    //3種方式的構造函數
    Vec3():x(T(0)),y(T(0)),z(T(0)){}
    Vec3(const T &xx):x(xx.x),y(xx.y),z(xx.z){}
    Vec3(T xx,T yy,T zz):x(xx),y(yy),z(zz){}
    T x,y,z;
};

typedef Vec3<float> Vec3f;

Vec3<float> a;
Vec3f b;

總結
通過本章的學習,您知道了以下知識:在數學上來說,一個向量可以有任意多個元素。然而在CG領域中,我們用了特別的定義——一個向量是3D空間中的方向(因此只有3個元素)。此外,一個點用三個元素表示。我們還介紹了同質點的概念,這個概念將會在後面的教程中大放異彩。
點和向量可以通過線性變換來改變狀態。典型的線性變換包括移動變換和旋轉變換。我們也介紹了單位化的概念,以及單位化的意義。最後我們用C++代碼模擬了上述的概念。

what’s next?
接下來我們會解釋點和向量的三個數字到底是什麼意思,它們表達出什麼情形。這三個數字代表的是點離某個參考的距離,這個參考通常叫做【座標系(coordinate system)】,這也是下面的文章將要討論的主題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章