CG中的幾何學——座標系【2】

原文地址:http://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/coordinate-systems

座標系簡介
在渲染的過程中,座標系扮演着一個很重要的角色。我記得我們在中學學幾何時,第一課就是教授的座標系的知識。我們在這裏複習一下這些座標系的知識以方便我們進一步學習矩陣相關的內容。
在之前的部分(http://blog.csdn.net/woshimairoude/article/details/72792901)我們瞭解到【點】和【向量】都是用三個實數構成的一個組來表示的。但這些數字到底表達的是個什麼意思呢?其實這些數字表示的是沿着一條線上的一個點離另一個點的距離。舉個例子,我們畫一條線,然後在這條線的中間做上一個標記。通常我們會把這個標記叫做【原點(origin)】。這個點就是我們的參考點,其他點的距離都是相對於這個點得出的。如果這個點在原點的右邊,那麼該點的距離就是正數,反之,則爲負數。
我們假設這條線是無限延伸的。因此,理論上這條線上兩個點之間的距離可以是無窮大的。不過,理論歸理論,在電腦裏面我們能夠表示的數的最大值是有限的。幸運的是,電腦裏能夠表示的最大數通常都是非常非常大的,基本能夠滿足我們構建複雜3D場景的需求。現在讓我們先不去管這個電腦能夠表示的最大數不是無窮大對我們造成的影響。
現在我們有一條線以及一個原點,讓我們再在這條線的原點兩邊每隔相同的距離做一個標記——沒錯,我們將這條線變成了一把帶刻度的尺子。我們可以用這把尺子量出任意一個點離遠點的距離。現在讓我們採用一種更正式的叫法,我們把這個距離叫做【座標】。在CG以及數學領域,這把尺子通常被我們稱作【座標軸】。
如果這個點不在座標軸上,我們如何確定它的座標呢?這裏寫圖片描述
我們可以畫一條通過這個點,並且與座標軸垂直的線來確定這個點在這條座標軸上的座標,座標的值即爲這條垂線和座標軸交點離該座標軸原點的距離。
到此爲止我們已經學會了如何定義一個點在一個座標軸上的座標。
維度和笛卡爾座標系(Dimensions and cartesian coordinate system)
我們現在給上面提到的那把水平放置的尺子一個特別的名字——【X軸(x-axis)】。同時,我們放上另一把與X軸垂直的尺子,且這把尺子經過x軸的原點,並把它叫做【Y軸(y-axis)】。對於任意一個點,我們可以通過上文介紹的畫一條與座標軸垂直的線的方式定義它的x座標和y座標。現在,我們可以通過兩個座標構成的有序組來表示任意的一個點了。我們放置了兩把尺子,這兩把尺子佔據了一個平面,在這個平面裏的任何一個點都可以用唯一的兩個數構成的一個有序組來表示。 因此,通過放置兩個軸,我們定義了一個二維的空間,這個空間通常叫做【面(plane)】。
假設我們在一張紙上面畫上若干個點。這張紙佔據了一個二維的空間,也就是一個面。我們可以在這張紙上再畫兩個軸,一個x軸,一個y軸。如果我們用這個x軸和y軸來定義我們所畫的所有這些點,那麼這兩個軸就定義了一個【座標系】。如果這兩個軸恰好互相垂直,我們稱這個座標系爲【笛卡爾座標系】。
我們通常使用一種簡化的叫做【有序對】的記號來記錄我們的點。有序對通常先寫x軸座標,然後寫y軸座標,中間寫一個逗號。比如(1,3)表示這個點的x軸座標是1,y軸座標是3。
到目前爲止,我們已經學會了如何用笛卡爾座標系的方式來定義點並且如何表示這些點。值得注意的是,在一個笛卡爾座標系中的點的定義是唯一的。也就是說在同一個笛卡爾座標系中的同一個點,不會同時擁有多個不同表示。不過,我們同時還必須意識到,我們可以想定義多少個座標系就定義多少個座標系。
事實上,我們可以定義無窮多個座標系。爲了簡單說明,現假設我們只在同一張紙上定義了兩個笛卡爾座標系。這裏寫圖片描述
如上圖,在這張紙上,我們畫上一個點p。同樣的一個點p在兩個不同的座標系裏面有不同的座標。在上圖中,p在A座標系的座標是(-1,3),在座標系B中的座標是(2,4)。
這就產生了一個問題,我們如何通過一個點在一個座標系中的位置計算出同樣的一個點在另一個座標系中的位置?在CG領域裏面,這種座標轉換是一種非常重要的操作。我們將會很快學到這種夢幻般的操作是如何進行的。
現在,我們還是用上面的那張圖來簡要的說明這個問題。通過上面那張圖,我們注意到一個事實:p在A座標系中的座標(-1,3)加上(3,1)就得到p點在B座標系中的座標(2,4)。而(3,1)剛好是座標系A的原點相對於座標系B的原點的座標。相反的,我們將p在B中的座標(2,4)加上(-3,-1)就得到p在A座標系中的座標(-1,3),而(-3,-1)剛還是座標系B的原點相對於座標系A的原點的座標。這一切都是巧合嗎?不,我相信我所看到的規律~
在座標系裏面移動一個點是很普遍的操作。通常我們把這種操作叫做【平移變換】,這也是我們能夠對一個點做的做基礎的操作。對於其他的尚未提到的線性變換也是能夠對點座標使用的。通過用一個實數與點座標相乘(結果就是將這個實數分別與x座標和y座標相乘的到一個新的座標),則我們對點進行了一次【縮放變換】。這裏寫圖片描述
比如點p(1.5,1.5),經過縮放變換之後,變成了點p(3,3),這就是與實數2相乘之後的結果。縮放的結果就是將點沿着改點與原點的連線移動已定的距離。ok,點到爲止,我們在之後會有章節來更詳細的討論這些個線性變換,稍安勿躁。

The Third Dimension(第三維)
3D座標系是對2D座標系的一種擴展。我們會在2D座標系的基礎上再添加一條與兩個軸正交(也就是同時與另外兩個軸垂直)的軸。這條新添加的軸被我們親切的叫爲【z軸(z-axis)】。x軸指向右邊,y軸指向上邊,z軸從屏幕裏指向我們。當然上面的這種定義並不是唯一的,我們會在下面說明其他的定義方式。在本系列教程中,我們將使用最開始提到的那種定義方式。在幾何學裏面,上面定義的那種3D座標系也被稱爲【歐幾里得空間】(嗯…霸氣的名字)。
我們用圖的方式來把本章中本部分介紹的座標系的定義精確的以及正式的給出來。在線性代數裏面,這個座標系中的三個軸被稱爲這個座標系的【基(basis)】。一個基是由若干【線性無關(linear independent)】的向量組成的。在這個基所定義的空間中的任何一個向量,都可以用構成這個基的若干向量的線性組合得到。那什麼是【線性無關】呢?線性無關的向量的意思就是:這些線性無關的向量中的一個向量,都不能用另外的向量用線性組合的方式算出來。改變空間的基(或者也叫做【空間變換】),是計算機渲染圖像的一個非常重要的操作。這裏寫圖片描述

左手座標系與右手座標系(Left-Handed vs Right_Handed Coordinate Systems
真實糟糕透了!我們不得不承認地球上有兩種人:左撇子和右撇子。可能你覺得這並不是什麼大不了的事,但事實上這對我們的CG領域的影響還是蠻大的。我們用下面一幅圖來說明這種情況:
這裏寫圖片描述
當我們的【上向量(up vector)】和【前向量(forward vector)】都指向相同的方向,此時我們的【右向量(right vector)】到底該指向哪邊呢?左撇子同學伸出他的左手,用食指對準前向量,用大拇指指向上向量,如上圖中的A圖所示。他看了看自己的中指,於是得出結論,右向量應該是中指指向的方向,也就是自己的右邊。於此同時右撇子同學伸出他的右手,如上圖中的B圖,食指和大拇指指向與左撇子同學相同的方向,但是右撇子同學看了看自己的中指,指向的是左邊,於是右撇子同學堅持認爲右向量應該指向自己的左邊。爲了消除左撇子或是右撇子歧視,我們同時保留了這兩種方式,並且把這兩種截然不同的座標系分別叫做左手座標系(左撇子同學的方式)以及右手座標系(右撇子同學的方式)。 如果我們將左手座標系的右向量和右手座標系的右向量統一指向左邊,會發現左手座標系的前向量與右手座標系的前向量剛好相反。
總之,這兩種座標系都是經常用到的,那麼我們怎麼快速的確定到底是左手座標系還是右手座標系呢?始終記住:中指始終指向的是右向量(x軸的方向)。我們先將中指對準x軸的方向,如果左手的大拇指和食指的方向和圖中所示的方向一致則是左手座標系,反之,則爲右手座標系。
哦,對了。左手座標系和右手座標系在計算多邊形面的朝向的時候也扮演着重要的角色。我們會在後面詳細的介紹原因,這裏只是順帶提一嘴。

右,上,前向量
笛卡爾座標系只是由三個相互垂直的單位向量定義。這種座標系的定義中並不包括這三個軸分別代表什麼意思的信息。開發者決定着這三個軸所表達的意思。所以我們必須明白在右手座標系和左手座標系裏面,這三個軸按照CG的習俗,應該分別表示什麼意思。
我們通常所說的上向量到底是指y軸還是z軸?讓我們假設x軸是右向量,如下圖:
這裏寫圖片描述
很明顯,這是一個右手座標系。我們要做的只是將一個座標系標上x,y,z。命名風俗(右,上,前向量)與座標軸是左手座標系還是右手座標系沒有直接關係。理解這一點很重要!由於很多系統裏面,z軸通常意味着上向量,大家就會以爲所有系統裏面都採用這種風俗,然而事實上並不是這樣。
對於一個座標系來說,“右向量”的方向直接關係着座標系是左手座標系還是右手座標系,這些軸代表什麼意思並不影響座標系是左手座標系亦或是右手座標系。
當我們在使用一個3D系統時,確定他使用的是右手座標系還是左手座標系至關重要。到目前爲止,CG領域大多使用右手座標系,x軸指向右向量,y軸指向上向量,z軸指向前向量。我們常用的Maya和OpenGL使用的是右手座標系,DirectX,pbrt以及PRMan使用的是左手座標系。我們之前說過,左手座標系和右手座標系的z軸是相反的,如果我們從Maya裏面到處模型道DirectX中,需要完成z座標的轉換。左右手座標系也影響向量的旋轉以及如何計算兩個向量的叉積。我們將在後面的章節詳細討論這些內容,再次請略過。
請注意,在本系列文章中,我們將始終使用右手座標系。因爲我們將會使用Maya,而且着似乎也將成爲工業標準~

世界座標系系統

我們已經學到一個向量和點的座標與笛卡爾座標系的原點的位置有直接的關係。同時我們也知道,我們能夠創建無數多個笛卡爾座標系。然而,在一個3D應用程序裏面,每一種不同的座標系都是參照一個叫做【世界座標系】的座標系定義的。世界座標系定義了一個終極的原點,其他的所有座標系都是以此原點爲參照。在渲染的過程中,世界座標系扮演着重要的角色,他將處於不同座標系中的物體之間建立了聯繫。這些物體包括3D模型,攝像機等。我們稍後會詳細介紹這中奇妙的聯繫。

我們需要記住的
這篇文章中提到的內容其實並不需要都記住,也沒有必要。重要的是對這些幾何知識以及CG中的術語留下印象。比如座標,軸,笛卡爾座標系。我們也介紹了一些線性變換的知識。最重要的內容是記住點的座標相關的內容,以及我們可以定義很多的座標系且每個點在一個座標系中的座標是唯一,足矣。最後,我們需要學會如何快速的判斷一個座標系是左手座標系還是右手座標系。且千萬記住左右手座標系和上,下,右向量真的沒有啥關係~

下一篇內容:點和向量的數學計算

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