2009-02-25 64 views
6

使用OpenGL我試圖繪製我校園的原始地圖。變焦,平移和旋轉如何工作?

任何人都可以向我解釋如何平移,縮放和旋轉通常實現?

例如,在平移和縮放時,是否僅僅是調整我的視口?因此,我繪製並繪製了構成我的地圖的所有線條,然後當用戶單擊並拖動它調整我的視口時?

對於平移,它是否會移動我的視口的x/y值和縮放是否增加/減少我的視口一定量?怎麼樣輪換?

對於旋轉,我是否必須爲代表我校園地圖的每條折線做仿射變換?在體面大小的地圖上進行飛行不是很昂貴嗎?

或者,視口是否保持不變並且在其他方​​向上進行平移/縮放/旋轉?


例如,如果你去這個link你會看到他描述平移和縮放究竟如何我有以上,通過修改視口。

這是不正確的?

回答

7

它們通過在繪製場景之前應用一系列glTranslate,glRotate命令(表示相機的位置和方向)來實現。 (從技術上講,你正在旋轉整個場景!)

有像gluLookAt這樣的工具函數,它可以抽象出關於這個的一些細節。

爲了簡化事物,假設您有兩個代表相機的向量:位置和方向。

gluLookAt獲取位置,目的地和向上向量。

如果你實現一個向量類,destinaion = position + direction應該給你一個目標點。

再次使事情變得簡單,你可以承擔了載體,始終是(0,1,0)

然後,在你的場景渲染任何東西之前,加載單位矩陣,並調用gluLookAt

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(source.x, source.y, source.z, destination.x, destination.y, destination.z, 0, 1, 0); 

然後開始繪製對象

您可以通過稍微向右或向左改變位置來讓用戶跨度。旋轉有點複雜,因爲你必須旋轉方向矢量。假設你正在旋轉的是相機,而不是場景中的某個物體。

一個問題是,如果你只有一個方向矢量「前進」,你如何移動它?左邊和右邊在哪裏?

我在這種情況下的做法是隻取「方向」和(0,1,0)的叉積。

現在你可以將攝像機移動到左邊和右邊使用類似:

position = position + right * amount; //amount < 0 moves to the left 

您可以使用「方向矢量」前進,但IMO它更好地限制運動水平面,所以得到正向矢量,我們有正確的向量的方式相同:

forward = cross(up, right) 

說實話,這是多少有些hackish的方法。

正確的方法是使用更復雜的數據結構來表示相機的「方向」,而不僅僅是前向。但是,由於您剛剛開始,因此一次只能採取一步一步的做法是件好事。

+2

讓我補充說,在任何時候,「視口」(通過glViewport設置)都進入這個過程。視口決定了你要渲染的窗口的哪個區域(事實上這不是真的,但現在就這樣想),並且通常會跨越整個窗口。 – Thomas 2009-02-25 03:09:45

1

通常有三個步驟適用於任何時候在opengl內引用3d空間中的任何點。

鑑於本地點

  • 地方 - >世界變換
  • 世界 - >攝像機變換
  • 相機 - >屏幕轉換(通常是一個投影,如果您使用的角度或正交取決於)

這些轉換中的每一個都將取你的3d點,並乘以一個矩陣。

當您旋轉相機時,它通常會通過將旋轉/平移/縮放仿射變換乘以變換矩陣來改變世界 - >相機變換。由於所有點都是重新渲染的每一幀,所以新的矩陣被應用到你的點上,並且它給出了旋轉的外觀。

4

所有這些「動作」都可以使用模型視圖矩陣轉換函數來實現。你應該閱讀關於glTranslatef(平移),glScalef(縮放),glRotatef(旋轉)。你還需要閱讀一些關於OpenGL的基本教程,你可能會發現this link有用。