opengl入門(ubuntu版)(二)

2021-07-11 08:21:52 字數 2821 閱讀 7117

在正式介紹opengl函式前先說一些基礎知識。

在使用opengl之前,我們要明白乙個什麼是視窗,什麼是視口。這裡給乙個不太準確的定義,視窗的大小表示全部可以用來畫圖的範圍,而視口的大小表示當前允許你畫圖的範圍。

下面是乙個小例子,雖然還沒有說明opengl具體函式的使用,這裡也先看乙個簡單的例子,說明視窗與視口的關係。**如下:

glviewport(30,30,100,100);

glbegin(gl_lines);

glvertex2f(-1.0,-1.0);

glvertex2f(-1.0,1.0);

glvertex2f(-1.0,1.0);

glvertex2f(1.0,1.0);

glvertex2f(1.0,1.0);

glvertex2f(1.0,-1.0);

glvertex2f(1.0,-1.0);

glvertex2f(-1.0,-1.0);

glend();

glviewport(50,50,200,200);

glbegin(gl_lines);

glvertex2f(-1.0,-1.0);

glvertex2f(-1.0,1.0);

glvertex2f(-1.0,1.0);

glvertex2f(1.0,1.0);

glvertex2f(1.0,1.0);

glvertex2f(1.0,-1.0);

glvertex2f(1.0,-1.0);

glvertex2f(-1.0,-1.0);

glend();

**執行後的效果如下:

上面的**中glviewport就是用來設定視口在視窗中的位置。**執行順序如下:

1.將視口的寬高設定為100,並將視口的左下角放在視窗的(30,30)的地方;

2.沿著視口邊緣繪製四條線;

3.將視口的寬高改為200,並將視口的左下角放在視窗的(50,50)的地方;

4.沿著視口邊緣繪製四條線;

看了這個例子,就比較好理解視口與視窗了,預設情況下視口的大小就是視窗的大小。所以可以在整個視窗範圍內繪圖。

opengl的作用是在螢幕上繪圖,所以opengl需要知道把圖繪製到什麼地方。上面已經說過,我們只能在視口的範圍內繪製,所以,我們需要在視口內建立乙個座標系統,將視口內的每乙個點都用座標表示出來,這樣opengl在繪製時就知道將圖形的每個點都畫在什麼地方了。以下是opengl預設的座標系:

其中綠色的框代表視口範圍,x,y,z軸的預設範圍都是-1~1的小數,原點在視口的中心,z軸的正方向是從螢幕指向**螢幕的人。以上這些只是預設情況的設定,如果需要都可以修改。

這裡有兩點要說明的:

1.視口內的座標預設是浮點數,所以理論上是連續的,但螢幕是由無數離散的點組成的,所以如果你要opengl畫乙個(-0.345,0.123)的點,opengl的底層會進行「四捨五入」將這個點畫在最接近的位置。

2.視口與視窗間的位置關係和視口內部使用兩套不同的座標系統。大家可以通過以上的說明體會一下。

先說說什麼是投影,在上文中我們提到了乙個z軸,其實仔細想想你會發現這個z軸很不「自然」。計算機的螢幕畢竟是乙個二維平面,你在z軸上畫乙個點,到底要畫在二維螢幕上的什麼位置上呢?這就好像你在畫畫,你看到的東西都是三維的,但你畫畫用的紙,卻是乙個二維平面,你需要一些技巧,利用這些技巧你可以實現在二維平面上畫出來的東西,讓人「看起來」是三維的。我想這並不難理解,這個技巧就叫做投影。

對於藝術家來說,這種技巧有很多種,有些畫家就是憑藉自己獨特的技巧而成名。但對於opengl這個技巧有兩種,正投影和透視投影。

下圖左邊就是正投影,右邊就是透視投影。

正投影可以理解為用一束平行光去「照」乙個三維物體,再用一張紙放在物體的後面,那麼三維物體的每個邊就都會在紙上留下乙個影子,這樣,就實現了三維物體到二維平面的對映,也就是投影。

透視投影與正投影的區別就是,將平行光,換為乙個點光源。這樣的對映會出現乙個近大遠小的效果(右圖投射在紙上的紅線就比綠線長),也比較符合我們在現實世界看到的效果。

其實,要生動的理解正投影與透視投影,需要一點數學的能力和對眼球構造的了解。但我覺得比較有用的就是記住以下幾點:

1.透視投影是用點光源,可以實現近大遠小,比較符合眼睛看東西的習慣;

2.正投影沒有近大遠小的效果,多用於模型設計等工業場合,可以精確反映物體的長度等物理量。

在現實的世界裡,任何實體都是三維的,再薄的一章紙,都是有厚度的,所以現實世界裡紙就有正反兩個面。opengl也真實的模擬了這種現象。對於opengl來說,繪製的每乙個圖形,都有正面和反面。你可以為正面和反面填充不同的顏色等效果,就好像你可以把一張紙的正面塗成紅色,反面塗成綠色。

這裡有乙個「特殊」的情況需要說明一下,opengl繪製的「立體「,都是空心的。比如你繪製乙個立方體,它是由6個「面」組成的,由於立方體是空心的,所以每個」面「依然有正面與反面。在預設情況下,opengl會去繪製所有的正面與反面,即使反面無法被看到。

正面與反面的各種現象實際還有好多,我以上只是給大家乙個粗略的印象,有些正反面產生的效果,甚至會讓你覺得「不科學」。但要想把「不科學」的東西,科學的解發布來,需要更多的知識,我會在後續補充。

opengl入門(ubuntu版)(一)

原帖位址 我寫的東西大部分是我學習的體會或是工作中遇到問題,所以很多東西可能不是很 精準 但我盡量做到好理解 好使用。如果想比較系統學習opengl可以先從一本叫 opengl超級寶典 的書入手,而且我建議對於沒有任何opengl的基礎的人要看這本書的第四版。因為,opengl在發展過程中以open...

OpenGL入門學習

include 太陽 地球和月亮 假設每個月都是30天 一年12個月,共是360天 static int day 200 day的變化 從0到359 void mydisplay void void myidle void int main int argc,char argv 3 關於垂直同步co...

OPENGL入門函式

glloadidentity 重置當前的模型觀察矩陣呼叫,glloadidentity 之後,您實際上將當前點移到了螢幕中心。gltranslatef x,y,z 沿著 x,y 和 z 軸移動。gltranslatef 1.5f,0.0f,6.0f 沿著x軸左移1.5個單位,y軸不動 0.0f 最後...