2012-05-15 26 views
1

我想實現一個使用OpenGL的應用程序,我需要實現基本的相機運動:軌道,平移和縮放。如何在OpenGL中實現基本的相機操作?

爲了讓它更清晰些,我需要類似Maya的相機控制。由於應用程序的性質,我無法使用好鏡頭來改變場景,使其看起來像相機移動。所以我堅持使用變換矩陣,gluLookAt等。我不知道如何實現其他兩個平移和軌道。我只知道掛鉤到眼睛矢量的深度組件(gluLookAt),但我不太清楚如何實現其他兩個平移和軌道。有沒有人曾經這樣做過?

回答

3

我不能用好ol‘改造現場,使它看起來像相機而動’

的OpenGL沒有攝像頭。所以你最終會做到這一點。

放大我知道是死很容易,我只是有掛鉤視線矢量(gluLookAt)的深度分量,

這不是放大,這是多莉。縮放意味着改變投影體積的界限,即正投影的範圍或視角的視場。

+0

謝謝,我其實並沒有完全確信我使用的名稱。所以「縮放」是Dolly,其他名稱是否正確? – Samssonart

+0

是的,如果你是指平移作爲替代相機旋轉,軌道爲讓物體周圍的攝像頭圈總是面對它。多莉意味着移動相機(也沿着觀看軸)。請注意,所有這些都在正交投影中起作用。但攝像機沿視軸臺車將不會改變圖像在鄰位,而具有立體它將「放大」的對象。但是變焦正在改變在鄰位和透視一樣的視圖限制和工作方式。 – datenwolf

1

gluLookAt,您已經遇到過,是您的解決方案。前三個參數是相機的位置(x,y,z),接下來的三個是相機的中心(它正在看的點),最後三個是向上矢量(通常爲(0,1,0)),它定義相機的yz平面。*

這很簡單:你只需glLoadIdentity(),調用gluLookAt(...),然後像通常一樣繪製場景。就我個人而言,我總是在CPU中完成所有的計算。我發現繞軌道運行是一項非常普遍的任務。我的模板C/C++代碼使用球面座標,看起來像:

double camera_center[3] = {0.0,0.0,0.0}; 
double camera_radius = 4.0; 
double camera_rot[2] = {0.0,0.0}; 
double camera_pos[3] = { 
    camera_center[0] + camera_radius*cos(radians(camera_rot[0]))*cos(radians(camera_rot[1])), 
    camera_center[1] + camera_radius*       sin(radians(camera_rot[1])), 
    camera_center[2] + camera_radius*sin(radians(camera_rot[0]))*cos(radians(camera_rot[1])) 
}; 
gluLookAt(
     camera_pos[0], camera_pos[1], camera_pos[2], 
    camera_center[0],camera_center[1],camera_center[2], 
    0,1,0 
); 

顯然可以調整camera_radius,這將改變攝像機,camera_rot的「放大」,這將改變相機有關其軸的旋轉,或camera_center,這將改變相機繞行的點。

*唯一的另一個棘手的問題是學習究竟是什麼意思。澄清,因爲互聯網缺乏:

  • 位置是相機的(x,y,z)位置。非常簡單。
  • 該中心是相機所關注的(x,y,z)點。你基本上是從的位置的中心沿假想射線
  • 現在,你的相機仍然可以看任何方向這個向量(例如,它可能是顛倒的,但仍沿着相同的方向)。向上矢量是一個矢量,不是的一個位置。它與從該位置到中心的虛擬矢量一起形成一個平面。這是相機的y-z平面。
相關問題