OpenGL组合旋转

时间:2015-08-24 14:00:50

标签: c++ opengl rotation

我无法理解如何使用OpenGL旋转来模拟MMORPG相机。我希望我的程序在我按下右键并移动鼠标时在2轴(x和y)上旋转相机。鼠标坐标的差异beetwen当我按下右键并且我现在在哪里时应该给我2个数字x和y。这些数字我将用来围绕我的角色旋转世界。

首先检查是否按下鼠标右键,然后重做最后一次旋转并进行当前旋转。但是当它组合2次旋转时,我会在z轴上旋转。

我检查了旋转是否正常,当他们只是一个,他们这样做。

我试过了:

a)为每个轴使用2个单独的glRotatef调用;

if(mouseRight==true)
        {
            glRotatef(-deltaMouse.x*mouseSensitivity,0,1,0);
            glRotatef(-deltaMouse.y*mouseSensitivity,0,0,1);
            mouse=sf::Mouse::getPosition();
            deltaMouse=initialMouse-mouse;
            glRotatef( deltaMouse.x*mouseSensitivity,0,1,0);
            glRotatef( deltaMouse.y*mouseSensitivity,0,0,1);
        }

所以我的问题是: 1)如何组合2个旋转来模拟MMORPG相机 2)如果我将自己的函数替换为glRotatef和glTranslatef会更好,但是当我想绘制它们时,我只是在顶点坐标上添加一些数字而不是使用矩阵吗?

2 个答案:

答案 0 :(得分:1)

您还应该反转矩阵顺序:

glRotatef(-deltaMouse.y*mouseSensitivity,0,0,1);
glRotatef(-deltaMouse.x*mouseSensitivity,0,1,0);
mouse=sf::Mouse::getPosition();
...

但是,如果多次执行此操作,也会引入滚动旋转。如果您不想这样,请将两个角度存储在变量中。然后,当鼠标移动时,只需更新这两个变量即可。在渲染之前,从头开始计算旋转矩阵(加载标识,旋转1,旋转2)。

答案 1 :(得分:0)

您应该在绘图函数中执行矩阵运算,只需从鼠标存储角度。要返回上一个状态,您可以使用push / pop矩阵。

mouse=sf::Mouse::getPosition();
if(mouseRight==true)
{
  deltaMouse = initialMouse-mouse;
  camera_angle.x += deltaMouse.x * mouseSensitivity;
  camera_angle.y += deltaMouse.y * mouseSensitivity;
}
initialMouse = mouse;

然后每一帧画出世界。

glPushMatrix();
glTranslatef(0, 0, -camera_orbit_distance);
glRotatef(-camera_angle.x,0,1,0);
glRotatef(-camera_angle.y,0,0,1);
glTranslatef(-camera_center.x, -camera_center.y, -camera_center.z);

// ... draw something with other glTranslatef and glRotatefs if needed for specific things.
// for example:
DrawWorldModel();
for (auto & enemy : enemies)
{
  glPushMatrix();
  glTranslatef(enemy.x, enemy.y, enemy.z);
  glRotatef(enemy.angle,0,0,1);
  DrawEnemyModel();
  glPopMatrix();
}

glPopMatrix();