2011-04-05 63 views
1

我試圖獲得一個FPS風格的攝像頭工作,同時遵循openGL SuperBible書中的示例。如何在OSX上實現沒有GLU的FPS攝像頭(或跨平臺)C++

這一切都很順利,直到我遇到了最終發生滾動的問題時,你真的只想要俯仰和偏航。

Similar question

這個問題基本上是問同樣的事情,但我希望有人也許能夠更詳細一點關於實施,理想與OpenGL超級GLTools框架的經驗。

我已經嘗試過實現GluLookAt code,這是我必須編譯的,但是在複製所需的函數時我犯了一個錯誤,或者在使用它時傳遞了錯誤的參數。

我想我覺得它有點混亂,因爲SuperBible代碼抽象了一些相機的工作原理,所以我很難正確實現它。當測試我的當前版本時,我傳遞了這樣的參數

M3DMatrix44f mCamera; 
cameraFrame.GetCameraMatrix(mCamera); //returns the matrix of the CameraFrame. 

M3DVector3f up = { 0.0f, 1.0f, 0.0f };  
M3DVector3f look = { xHeading,yHeading,0.0f }; 

//xHeading & yHeading ranges from -1 to 1 based on mouse movement, is this correct? 

我該如何管理和傳遞外觀變量?目前看起來外觀價值是停留在同一個地方,所以如果我向後移動,我最終會在現場旋轉。

glhLookAtf2(mCamera, mCamera, look, up); 

我覺得我必須更好地管理我的視線方向,也可能是我的相機位置。看起來似乎沒有改變似乎很奇怪。

任何人都可以幫忙,或者指向一個堅實的教程路徑的方向嗎?我試圖避免做任何過時的事情,但在這一點上,我真的很高興,只是爲了得到一些工作。

+0

另外,當我使用wasd鍵移動場景時,看預設爲{1.0f,1.0f,1.0f}他們的相機不會集中在場景的中間。但是,當我將鼠標中的變量從-1改爲1時,相機確實會移動,只是不正確。如果我修正了外觀的位置,相機是否應該專注於中心? – 2011-04-05 00:46:23

回答

0

感謝大家的答案,但我有這個問題是這樣的。在openGL超級聖經中,我使用了它們內置的引用類框架,而我遇到的問題是兩個函數,一個叫做rotate,另一個叫rotateWorld。

我需要使用旋轉進行上/下移動,並將rotateWorld用於左右移動。這使相機行爲正常(飛相機)。

這樣做很有意義,因爲無論你在哪裏向上/向下看,你都希望整個世界總是圍繞垂直軸旋轉。唷!

0

這很容易。你只需要3個向量處理相機: 位置,相對注視和相對向上向量

在設置的3,你可以像這樣提供那些gluLookAt:

gluLookAt(camera.eye.x,camera.eye.y,camera.eye.z, 
     camera.lookAt.x,camera.lookAt.y,camera.lookAt.z, 
     camera.up.x,camera.up.y,camera.up.z); 

不要混淆,camera.lookAt是realtive注視與視線矢量加入:

camera.lookAt = camera.eye + camera.rLookAt; 

所以應該基本覆蓋設置一個照相機。相機的下一項基本任務正在​​發生變化。這是由於相對LookAt簡單的任務,因爲你只更新眼睛矢量。您可能還想更新絕對LookAt,但這是我上面顯示的同一段代碼。

最後,您需要旋轉視圖。棘手的是,你可以使用3個解釋 - 矩陣,3個角度或季節。因爲角度很容易理解(另一方面,他們的表現最差,並且受到萬向節鎖的影響),我會告訴你如何做到這一點。我不會描述什麼萬向節鎖,你可以谷歌這一個,但爲了避免它,我們需要限制旋轉。我們將使用完整的360°進行水平旋轉,但只能使用180°進行垂直旋轉。如果您看看openGl協調系統,我們可以定義關於Y軸和垂直X軸的水平旋轉。對於應用旋轉向量,我們使用,那麼這些代碼2:

vector3f vector3f::rotateX(const float &radians) 
{ 
    float t_y = y; 

    y = t_y*cos(radians) + z*sin(radians); 
    z = t_y*-sin(radians) + z*cos(radians); 
    return *this; 
} 

vector3f vector3f::rotateY(const float &radians) 
{ 
    float t_x = x; 

    x = t_x*cos(radians) + z*-sin(radians); 
    z = t_x*sin(radians) + z*cos(radians); 
    return *this; 
} 

你可以看到,我複製這個從我的代碼。 vector3f只是一個包裝3D矢量的類。 x,y和z是定義向量的公共成員。

所以,如果你想音高,這是基本rotateX和偏航旋轉。 要更新相機,您需要旋轉相對的LookAt和Up矢量,計算絕對LookAt並將其提供給gluLookAt。這就是全部......

PS:在OSX上編寫opengl的人很少。我從來沒有跑過OSX,但作爲跨平臺的openGl肯定仍然很受歡迎。

PSS:我忘了提,不要加旋轉。最好加角度和每次旋轉向量集合時間到默認位置,並與絕對角度旋轉:

rLookAt.set(0,0,-1); 
rLookAt.rotateX(rotations.x); 
rLookAt.rotateY(rotations.y); 
lookAt = eye + rLookAt; 

up.set(0,1,0); 
up.rotateX(rotations.x); 
up.rotateY(rotations.y);