OpenGL中的坐標(biāo)系-2D

關(guān)于坐標(biāo)系系統(tǒng)

在圖形渲染管線中,坐標(biāo)系系統(tǒng)扮演了一個非常重要的角色,他們并不是很復(fù)雜。當(dāng)我們在學(xué)校學(xué)習(xí)幾何的時候,第一個接觸到的就是坐標(biāo)。不過,還是讓我們來先見識一下這些東西,這將使得我們更容易理解矩陣的概念。

在前一篇文章中我們討論了關(guān)于點(diǎn)、向量的概念。在那里,點(diǎn)和向量都是由三個實(shí)數(shù)來表示的,但是那些數(shù)字到底有什么意義呢?每個一個實(shí)數(shù)表示一個他們到原點(diǎn)的距離。比如,我們畫一條直線,并且在線的正中間標(biāo)記一個點(diǎn),我們說這個點(diǎn)就是原點(diǎn)。此時這個點(diǎn)就是用于我們?nèi)ズ饬烤嚯x的一個參考點(diǎn)。如果一個點(diǎn)在原點(diǎn)的右邊,我們把它的距離表示為大于0的數(shù),如果一個點(diǎn)在原點(diǎn)的左邊,我們把它的距離用小于0的數(shù)來表示。

我們假設(shè)一條線,向原點(diǎn)的兩邊無限延伸,這樣一來,兩個端點(diǎn)的距離就是無窮大。在數(shù)學(xué)上,這并沒有什么問題,但是在計(jì)算機(jī)的世界里,這就有問題了。一般而言,我們只能計(jì)算有限范圍內(nèi)的東西。不過,這有限的大小其實(shí)已經(jīng)足夠我們?nèi)?chuàng)建復(fù)雜的3D世界了,所以這并不會對我們產(chǎn)生什么實(shí)質(zhì)的影響。

4.jpg

現(xiàn)在我們在這條線上畫上刻度,這樣一來,這條線就可以用來丈量長度。于是我們可以用它來衡量一個點(diǎn)的坐標(biāo)位置到底是多少。在計(jì)算機(jī)里,這個刻度尺我們管它叫坐標(biāo)軸。

如果某一個點(diǎn)不在坐標(biāo)軸上,我們依然可以把它的位置投影到坐標(biāo)軸上去。投影點(diǎn)與原點(diǎn)的距離就是我們這個點(diǎn)相對于原點(diǎn)的坐標(biāo)位置了。

我們已經(jīng)在不經(jīng)意之間說完了在一條坐標(biāo)軸上定義一個點(diǎn)的坐標(biāo)位置了。

維度和笛卡爾坐標(biāo)系

讓我們把水平的那條線當(dāng)成是x軸。我們可以接著繪制第二條坐標(biāo)軸,這條坐標(biāo)軸穿過原點(diǎn)垂直于x軸。我們叫這條坐標(biāo)軸為y軸。從此刻開始,對于任意一個點(diǎn),我們可以將他們分別投影到x和y軸上,然后計(jì)算投影點(diǎn)到原點(diǎn)的距離,并用用此來表示該點(diǎn)的坐標(biāo)位置了。這樣的位置包含兩個數(shù),兩個數(shù)分別表示x軸坐標(biāo)和y軸坐標(biāo)。所以,我們可以說,我們用兩個坐標(biāo)軸,就可以定義一個二維空間。

image

比如,在一張紙上畫上一堆點(diǎn)。這張紙占據(jù)了一個二維空間。可以看成是一個平面。我們可以為每個維度畫一個坐標(biāo)軸。如果我們再次使用x和y軸來衡量每個點(diǎn)的位置,這倆坐標(biāo)軸就構(gòu)成了一個坐標(biāo)系統(tǒng)。如果這兩個坐標(biāo)軸是互相垂直的,那么我們管它叫:笛卡爾坐標(biāo)系。

我們一般用一組有著明確先后順序的申明來表示一個點(diǎn)的坐標(biāo)。這兩個記號用逗號隔開。對于笛卡爾坐標(biāo)系來說,我們一般的把x軸的坐標(biāo)寫在前面,y軸的坐標(biāo)卸載后面。比如,我們會將一個x坐標(biāo)為2.5,y坐標(biāo)為2.25的點(diǎn)記做(2.5,2.25)。但是你也別被這兩個東西嚇著了,他們只是標(biāo)記了這個點(diǎn)到原點(diǎn)的位置關(guān)系。

到現(xiàn)在為止,我們已經(jīng)搞懂了,如何制作一個2D坐標(biāo)系,并且在這個坐標(biāo)系中定義2D的點(diǎn)。你還需要明確的是,這些點(diǎn)的2D坐標(biāo)是唯一的。意思就是說,在同一個坐標(biāo)系下同一個坐標(biāo)所表示的點(diǎn)不可能出現(xiàn)在不同的位置上。你還需要知道的是,世界上不止有標(biāo)準(zhǔn)坐標(biāo)系,坐標(biāo)系的坐標(biāo)軸不一定非得是水平和垂直的,你愛怎么擺放你的坐標(biāo)系都行。

事實(shí)上,我們可以在一個平面上定義無數(shù)多個坐標(biāo)系。為了簡單,我們假設(shè),我們在紙上畫了兩個笛卡爾坐標(biāo)系。并且,我們在這個紙上放了一個點(diǎn)。此時點(diǎn)的坐標(biāo)會因?yàn)閰⒖甲鴺?biāo)系的不一樣而變得不一樣,雖然他們的物理位置是不變的。比如說:

6.jpg

點(diǎn)P在A坐標(biāo)系下的坐標(biāo)是(-1,3),在B坐標(biāo)系下的坐標(biāo)卻是(2,4)。然而他們表達(dá)的是同一個點(diǎn)。是不是想起來OpenGL中的那些坐標(biāo)了?對OpenGL矩陣在干嘛是不是又增進(jìn)了一丟丟理解?

所以,如果我們知道B坐標(biāo)系下點(diǎn)P的坐標(biāo),我們需要什么樣的東西來求得A坐標(biāo)系下,該點(diǎn)的坐標(biāo)呢?這個原理在我們的計(jì)算機(jī)圖形學(xué)里尤為重要。我們將很快會學(xué)到,如何將一個點(diǎn)的坐標(biāo)從一個坐標(biāo)系系統(tǒng)映射到另一個坐標(biāo)系系統(tǒng)。

現(xiàn)在,我們來考量前面的例子。我們可以通過將坐標(biāo)(-1,3)加上(3,1)來達(dá)到將P點(diǎn)的坐標(biāo)從A坐標(biāo)系映射到B坐標(biāo)系的效果。并且給坐標(biāo)(2,4)加上(-3,-1)可以將P點(diǎn)的坐標(biāo)從B坐標(biāo)系映射到A坐標(biāo)系。我們這里要注意的是,(-3,-1)和(3,1)剛好是互逆的。也就是關(guān)鍵字:inverse。


7.jpg

另一個比較常見的操作就是講一個點(diǎn)從坐標(biāo)系的一個位置移動到另一個位置,此時參考坐標(biāo)系并沒有改變。這種操作叫做平移操作。這也是最基本的操作。其實(shí)其他的所有線性變換也是可以應(yīng)用到點(diǎn)上去的。給點(diǎn)的坐標(biāo)乘上一個常數(shù),會對點(diǎn)的坐標(biāo)產(chǎn)生縮放的影響。對點(diǎn)進(jìn)行縮放,在空間上會表現(xiàn)為,點(diǎn)會沿著連接它與原點(diǎn)的直線進(jìn)行運(yùn)動。

另外請學(xué)習(xí)引擎課程的同學(xué)務(wù)必看完我們提供的全套所有文字資源,雖然有些枯燥,但是會時時刻刻體現(xiàn)在引擎課程的代碼中。真正開課的時候,你將不必為這些瑣碎的知識點(diǎn)而蛋疼菊緊。

最后,同志們吶,求轉(zhuǎn)發(fā),求推廣。集齊200閱讀量,隔日,更多文章立馬吐血加工趕制出來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容