-1

我正在使用 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) 到 (width,height,0) 的矩形。这种尝试主要是功能性的,除非当 y 增加时,地面变得更远。我不确定是什么原因造成的,但我认为它与这段代码有关,因为当我将 AOA 设置为 90(因此相机直接指向下方)时,它不会发生。

注意:出于必要,我使用模型矩阵而不是视图矩阵来处理相机的运动。

4

1 回答 1

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);
于 2013-10-27T21:29:06.720 回答