我正在使用OpenGL 4.0,我正在尝试编写一个具有两个属性的游戏相机。 “攻角”和“旋转”
我正在尝试构建一个非常类似于其他RTS游戏的相机,例如“魔兽争霸3”或“星际争霸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 :(得分: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);