它們通過在繪製場景之前應用一系列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的方法。
正確的方法是使用更復雜的數據結構來表示相機的「方向」,而不僅僅是前向。但是,由於您剛剛開始,因此一次只能採取一步一步的做法是件好事。
讓我補充說,在任何時候,「視口」(通過glViewport設置)都進入這個過程。視口決定了你要渲染的窗口的哪個區域(事實上這不是真的,但現在就這樣想),並且通常會跨越整個窗口。 – Thomas 2009-02-25 03:09:45