OpenGL组合旋转
OpenGL combining rotations
我很难理解如何使用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();
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 与互斥锁相比,旋转锁可以保证上下文切换
- 可组合的lambda/std::函数与std::可选
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 混合组合和继承的C++问题
- 绘制旋转的三角形
- 我需要将多个函数组合为一个函数
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 旋转模型矩阵时的形状失真
- 四边形的 2D 旋转
- 通过组合不同的类型来创建唯一的id
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 模板元编程:如何将参数包组合成新的参数包
- 垂直方向的 Gtk3+ 旋转按钮 (c/c++)
- 发布旋转矩阵(openGL/glm)
- 检查向量是否具有所有可能的字符组合
- 如何在加密++中将两个源组合成新的源
- 根中的组合
- OpenGL组合旋转
- c++矢量旋转所有组合