我想實現一個使用OpenGL的應用程序,我需要實現基本的相機運動:軌道,平移和縮放。如何在OpenGL中實現基本的相機操作?
爲了讓它更清晰些,我需要類似Maya的相機控制。由於應用程序的性質,我無法使用好鏡頭來改變場景,使其看起來像相機移動。所以我堅持使用變換矩陣,gluLookAt等。我不知道如何實現其他兩個平移和軌道。我只知道掛鉤到眼睛矢量的深度組件(gluLookAt),但我不太清楚如何實現其他兩個平移和軌道。有沒有人曾經這樣做過?
我想實現一個使用OpenGL的應用程序,我需要實現基本的相機運動:軌道,平移和縮放。如何在OpenGL中實現基本的相機操作?
爲了讓它更清晰些,我需要類似Maya的相機控制。由於應用程序的性質,我無法使用好鏡頭來改變場景,使其看起來像相機移動。所以我堅持使用變換矩陣,gluLookAt等。我不知道如何實現其他兩個平移和軌道。我只知道掛鉤到眼睛矢量的深度組件(gluLookAt),但我不太清楚如何實現其他兩個平移和軌道。有沒有人曾經這樣做過?
我不能用好ol‘改造現場,使它看起來像相機而動’
的OpenGL沒有攝像頭。所以你最終會做到這一點。
放大我知道是死很容易,我只是有掛鉤視線矢量(gluLookAt)的深度分量,
這不是放大,這是多莉。縮放意味着改變投影體積的界限,即正投影的範圍或視角的視場。
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,這將改變相機繞行的點。
*唯一的另一個棘手的問題是學習究竟是什麼意思。澄清,因爲互聯網缺乏:
謝謝,我其實並沒有完全確信我使用的名稱。所以「縮放」是Dolly,其他名稱是否正確? – Samssonart
是的,如果你是指平移作爲替代相機旋轉,軌道爲讓物體周圍的攝像頭圈總是面對它。多莉意味着移動相機(也沿着觀看軸)。請注意,所有這些都在正交投影中起作用。但攝像機沿視軸臺車將不會改變圖像在鄰位,而具有立體它將「放大」的對象。但是變焦正在改變在鄰位和透視一樣的視圖限制和工作方式。 – datenwolf