2013-10-27 27 views
-1

我正在使用OpenGL 4.0,我試圖寫一個遊戲攝像頭有兩個屬性。 「攻角」和「旋轉」RTS風格的遊戲攝像頭編碼模型矩陣

我想構建一個非常類似於其他RTS遊戲的相機,例如魔獸爭霸3或Starcraft II,其中相機(默認情況下)以相當陡峭的角度面對地面。

我使用一些支持代碼,其作用非常類似於舊的OpenGL的glTranslatef,glRotatef 我現在的嘗試是這樣的:

shaders->Model.Translate(-cameraPosition.x,-cameraPosition.y,-cameraPosition.z); 
//Apply rotation 
//shaders->Model.Rotate(rotation/M_PI*180.0f,0,0,1); 

//Apply AOA 
float aX = cos(2*3.141592 - rotation - 3.141592/2.0); 
float aY = sin(2*3.141592 - rotation - 3.141592/2.0); 
shaders->Model.Rotate(90.0f-(float)angleOfAttack/M_PI*180.0f,aY,aX,0); 

這一點之後,地面被畫成從一個矩形(0 ,0,0)到(寬度,高度,0) 這種嘗試主要是功能性的,除非y越大,地面距離越遠。我不確定是什麼導致了這一點,但我認爲它與這個代碼有關,因爲當我將AOA設置爲90(所以相機直接指向下方)時,它不會發生。

注意:我使用模型矩陣而不是視圖矩陣來處理攝像機的運動。

回答

0

想通了。愚蠢的問題,我猜。 訣竅是做旋轉後的X,Y翻譯,之前不是

//Apply translation 
shaders->Model.Translate(0,0,-cameraPosition.z); 
//Apply rotation 
//shaders->Model.Rotate(rotation/M_PI*180.0f,0,0,1); 

//Apply AOA 
float aX = cos(2*3.141592 - rotation - 3.141592/2.0); 
float aY = sin(2*3.141592 - rotation - 3.141592/2.0); 
shaders->Model.Rotate(90.0f-(float)angleOfAttack/M_PI*180.0f,aY,aX,0); 

shaders->Model.Translate(-cameraPosition.x,-cameraPosition.y,0);