【问题标题】:OpenGL combining rotationsOpenGL组合旋转
【发布时间】:2015-08-24 14:00:49
【问题描述】:

我无法理解如何使用 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 会更好吗?而不是使用矩阵,我只是在我想绘制它们时向顶点坐标添加一些数字?

【问题讨论】:

  • 如果您围绕 x 和 y 轴旋转您的世界,您可以(并且可能会)在 z 轴上进行更改。您究竟希望相机做什么?它会在一个平面内旋转还是围绕你的角色完全旋转/轨道?
  • 假设我的角色在点 (0,0,0)。现在想象一个大球体。我的角色在球体内。我对世界的看法将以点为中心属于球体。我想以不影响 z 轴(开头看到的 z 轴)的方式围绕我的角色旋转。

标签: c++ opengl rotation


【解决方案1】:

您还应该反转矩阵顺序:

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

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

【讨论】:

    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 2019-05-03
      • 2017-08-24
      • 1970-01-01
      相关资源
      最近更新 更多