OpenGL组合旋转

OpenGL combining rotations

本文关键字:旋转 组合 OpenGL      更新时间:2023-10-16

我很难理解如何使用OpenGL旋转来模拟MMORPG摄像机。我希望我的程序在2轴(x和y)上旋转相机,当我按右键,我移动鼠标。当我按右键和我现在所在的位置之间的鼠标坐标差异应该给我两个数字x和y,我将使用这些数字来围绕我的角色旋转世界。

我首先检查是否按下鼠标右键,然后重做上次旋转并执行当前旋转。但是当它把这两个旋转结合在一起时,它会在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,而是使用矩阵,我只是添加一些数字到顶点坐标,当我想画它们会更好吗?

您还应该反转矩阵顺序:

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

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

你应该在绘图函数中执行矩阵操作,只是从鼠标存储角度。要返回到以前的状态,可以使用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();