2008-11-13 299 views
27

在OpenGL中,我試圖圍繞一個點旋轉攝像頭,攝像頭距離點距離r,並在旋轉時面向點。換句話說,我希望攝像機沿圓周以半徑r從中心移動,相機朝向圓周任意點的中心。可以說在三維空間中圓的中心是(3,0,3);而在三維空間中,圓的中心是(3,0,3)。OpenGL圍繞一個點旋轉攝像頭

我已經試過:

// move to center of circle  
glTranslatef(-3, 0, -3) 
// move a distance away from the circle 
glTranslatef(0, 0, r); 
// rotate along the y "up" axis 
glRotatef(CameraAngle, 0, 1, 0); 

其中CameraAngle是度的情況下繞了一圈移動。

我的最終結果是相機仍然沿原點旋轉,而不是圓的中心。任何人都可以幫我解決這個問題嗎?謝謝!

回答

24

您需要:

  • 旋轉的攝像頭周圍的原點,然後翻譯它(*)

或:

  • 使用gluLookAt保持相機指向圓的中心

(*)旋轉功能通常圍繞原點旋轉。要繞另一點P你必須:

  • 翻譯(-P)
  • 旋轉
  • 翻譯(P)
+0

我已經做了使用「四元數原型」(我的Vector類中的一個簡單的方法,其中圍繞其他矢量旋轉一個)。看起來更加靈活=) – shybovycha 2010-11-21 19:52:40

2

我覺得像這樣的問題容易得多gluLookAt解決( )。你爲相機定義一個路徑(一個圓圈很容易!),並保持「中心」點固定(即你正在看的東西)。

唯一可能的技巧是定義一個好的向量 - 但通常不是太多的工作。如果路徑和目標點位於同一平面內,則每次都可以使用相同的向上向量!

3

爲什麼要麻煩旋轉相機而不旋轉場景本身?
它更直截了當。只需圍繞原點旋轉模型視圖矩陣。你會得到完全相同的結果。

+8

這種情況下的相機是通過旋轉模型視圖矩陣來實現的,因此旋轉模型視圖矩陣與旋轉相機相同。旋轉場景包括使用不同的頂點位置等......我認爲你的帖子有點混亂。 – jheriko 2009-02-03 10:47:06

10

這是一個有點混亂,但我認爲你應該:

// move camera a distance r away from the center 
glTranslatef(0, 0, -r); 

// rotate 
glRotatef(angley, 0, 1, 0); 
glRotatef(anglex, 1, 0, 0); 

// move to center of circle  
glTranslatef(-cx, -cy, -cz) 

記下訂單不能改變。