当前位置: 首页 > 知识库问答 >
问题:

如何使用GLFW在openGL中旋转相机?

韦熙云
2023-03-14

我正在使用GLFW在c中创建一个OpenGL应用程序。基于本教程,我成功地创建了类似FPS的摄影机(WASD移动-鼠标移动-俯仰-偏航)。

我使用的相机鼠标移动

glfwSetCursorPosCallback(window, mouse_callback);
void mouse_callback(GLFWwindow* window, double xpos, double ypos)
{
    if (firstMouse)
    {
        lastX = xpos;
        lastY = ypos;
        firstMouse = false;
    }

    float xoffset = xpos - lastX;
    float yoffset = lastY - ypos; 
    lastX = xpos;
    lastY = ypos;

    float sensitivity = 0.1f;
    xoffset *= sensitivity;
    yoffset *= sensitivity;

    yaw += xoffset;
    pitch += yoffset;

    if (pitch > 89.0f)
        pitch = 89.0f;
    if (pitch < -89.0f)
        pitch = -89.0f;

    glm::vec3 front;
    front.x = cos(glm::radians(yaw)) * cos(glm::radians(pitch));
    front.y = sin(glm::radians(pitch));
    front.z = sin(glm::radians(yaw)) * cos(glm::radians(pitch));
    cameraFront = glm::normalize(front);
}

这很好,但问题是我的应用程序窗口不是全屏的,所以如果我想旋转鼠标光标,它就会离开窗口,很难控制相机。

是否可以做与glfwSetCursorPosCallback相同的事情,但仅当按下左键时?我希望相机做与现在相同的事情,但仅当我按下左键时。

共有1个答案

壤驷鸿祯
2023-03-14

是否可以执行与glfwSetCursorPosCallback相同的操作,但只有在按下左键时才可以?我想让相机做和现在一样的事情,但前提是我按下左键。

glfwSetMouseButtonCallback设置一个回调,当按下鼠标按钮时会收到通知。
当前鼠标(光标)位置可以通过glfwGetCursorPos获取。

添加鼠标按钮回调:

glfwSetMouseButtonCallback(window, mouse_button_callback);

并获取回调中的鼠标位置:

void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
{
    if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS)
    {
        double xpos, ypos;     
        glfwGetCursorPos(window, &xpos, &ypos); 

        // [...]
    }
}
 类似资料:
  • 我试图创建一个第一人称相机。我从我的XNA项目中提取了一段代码,并试图将其转换为java(LWJGL)。 如果我移动鼠标,俯仰和偏航会增加/减少。在开始运行我的游戏时,它运行良好,但在一些动作后,我无法向下或向上看。如果我的位置是 性能良好的XNA代码: 所以我发现LWJGL和XNA在旋转矩阵方面有一些不同。 Java: 结果: {1.0 0.0 0.0 0 0.0}{0.0 0.3299931-

  • 我有一个相机旋转矩阵3x3,然后我用罗德里格斯函数从旋转矩阵中得到旋转矢量,但是它给出的结果像,但是OpenGL函数需要度数。我认为是归一化的,我应该把每个元素乘以360来得到度数。但是OpenCV和OpenGL之间也有坐标系的差异。我如何在OpenGL坐标系中获得度数的旋转矢量?

  • 我问了一个以前被问过一百万次的问题,但在浏览了这些问题并求助于其他网站之后,我仍然没有找到一个好的答案: 如何在全局轴上旋转图形,而不是本地轴? opengl中的旋转对象 如何像OpenGL中的glRotatef()一样旋转顶点? 在OpenGL中围绕3个轴旋转对象 在OpenGL中沿对象自身的轴旋转对象 有没有可能让一个物体绕着它自己的轴旋转,而不是绕着基坐标轴旋转? OpenGL旋转-局部轴与

  • 我需要优化我的渲染代码,目前我正在使用glPushMatrix()和glTranslatef()以及glRotatef()。但这比在单个顶点数组调用中渲染所有对象的成本更高。 OpenGL中是否有一些快速的内置函数可以像glRotatef()一样旋转我的顶点数据?如果没有,你会推荐使用什么库或方法?我所知道的唯一方法是使用sin/cos函数来旋转顶点,但我不确定这是否是最快的方法,或者它甚至会导致

  • OpenGL总是围绕(0,0,0)旋转。但是我需要绕着相机旋转。我知道在GL中,没有相机,但是如果我翻译回(0,0,-6.0),它会绕着(0,0,0)旋转,而不是绕着(0,0,-6.0)旋转 所以我的问题是:如何在opengl和c中设置旋转中心 我已经找到了这篇文章:OpenGL围绕一个点旋转相机 显示此解决方案的地方: 旋转函数通常围绕原点旋转。要围绕另一个点P旋转,必须:平移(-P)旋转平移(

  • 所以我对opengl和创建3d形状非常陌生。对于我的例子,我有两个正方形,一个是高度/宽度2,中心在原点坐标(0,0,-10),另一个在窗口的最左侧。我试图沿着x-z平面旋转位于原点的正方形,而不旋转位于屏幕最左侧的正方形。我的方法是将中心正方形的每个xyz坐标保存为一个变量,并创建一个使用cos(θ)行为沿着x-z平面旋转正方形的方法。我的代码工作,但我认为这是一个可怕的方法,因为一定有一些更有