2013-10-27 28 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);