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