C++ OpenGL与鼠标的奇怪旋转结果

C++ OpenGL与鼠标的奇怪旋转结果,c++,opengl,mouse,glm-math,C++,Opengl,Mouse,Glm Math,所以我正在开发一个3d绘画应用程序。我设法制作了一个基本的渲染器和模型加载器 我创建了一个相机系统,可以使用它在场景中导航(鼠标/键盘),但这不是我想要的,所以我将相机设置为静态,现在我尝试旋转/平移/缩放模型本身。我设法实现了平移和缩放。对于平移,我根据鼠标更改x/y位置;对于缩放,我根据鼠标滚动从z轴添加或减去 但是现在我想能够用鼠标旋转3d模型。示例:当我按住鼠标右键并向上移动鼠标时,模型应在其x轴上旋转(俯仰),如果我向左/向右移动鼠标,则应在y轴上旋转(偏航)。我就是做不到 下面的代码

所以我正在开发一个3d绘画应用程序。我设法制作了一个基本的渲染器和模型加载器

我创建了一个相机系统,可以使用它在场景中导航(鼠标/键盘),但这不是我想要的,所以我将相机设置为静态,现在我尝试旋转/平移/缩放模型本身。我设法实现了平移和缩放。对于平移,我根据鼠标更改x/y位置;对于缩放,我根据鼠标滚动从z轴添加或减去

但是现在我想能够用鼠标旋转3d模型。示例:当我按住鼠标右键并向上移动鼠标时,模型应在其x轴上旋转(俯仰),如果我向左/向右移动鼠标,则应在y轴上旋转(偏航)。我就是做不到

下面的代码是我在屏幕上得到光标的xpos/ypos,计算偏移量和“尝试旋转立方体”。唯一的问题是,如果我向上移动鼠标,模型在x轴和y轴上旋转时稍微倾斜一点,则无法正常旋转立方体。反之亦然。

这是我的渲染循环中的代码:

    shader.use();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), 
    (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.01f, 100.0f);
    shader.setMat4f("projection", projection);

    glm::mat4 view = camera.getViewMatrix();
    shader.setMat4f("view", view);

    glm::mat4 modelm = glm::mat4(1.0f);
    modelm = glm::translate(modelm, object_translation);
    // Should rotate cube according to mouse movement
    //modelm = glm::rotate(modelm, glm::radians(angle), glm::vec3(0.0f));
    shader.setMat4f("model", modelm);

    renderer.draw(model, shader);
这是我处理鼠标移动回调的调用:

void mouseCallback(GLFWwindow* window, double xpos, double ypos)
{
if (is_rotating)
{
    if (is_first_mouse)
    {
        lastX = xpos;
        lastY = ypos;
        is_first_mouse = false;
    }

    // xpos and ypos are the cursor coords i get those with the 
    mouse_callback
    double xoffset = xpos - lastX;
    double yoffset = lastY - ypos;

    lastX = xpos;
    lastY = ypos;

    object_rotation.y += xoffset; // If i use yoffset the rotation flips
    object_rotation.x += yoffset;

    rotation_angle += (xoffset + yoffset) * 0.25f;
}
}

鼠标平移也可以很好地工作,但不能说旋转也是如此。

您将旋转存储为对象旋转中的euler角

我建议您使用:

glm::mat4 rotation = glm::eulerAngleYX(object_rotation.y, object_rotation.x); // pitch then yaw


在你的情况下,两者都应该做这项工作,我建议你将来把这些信息存储在你的相机里(眼睛,向上,居中),而不是你的物体,一切都会变得更简单。

我修正了它。经过一些研究和询问,我被告知你一次只能做一个旋转,我试图同时做两个x/y轴。一旦我分开两个旋转对象现在将先沿x轴旋转,然后沿y轴旋转问题已解决

代码应如下所示:

    shader.use();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.01f, 100.0f);
    shader.setMat4f("projection", projection);

    glm::mat4 view = camera.getViewMatrix();
    shader.setMat4f("view", view);

    glm::mat4 modelm = glm::mat4(1.0f);
    modelm = glm::scale(modelm, glm::vec3(1.0f));
    modelm = glm::translate(modelm, glm::vec3(0.0f, 0.0f, -5.0f));
    // Handle x-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_x), glm::vec3(object_rotation_x, 0.0f, 0.0f));
    // Handle y-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_y), glm::vec3(0.0f, object_rotation_y, 0.0f));
    shader.setMat4f("model", modelm);

    renderer.draw(model, shader);

没有更多的信息,人们无法帮助你。请描述您正在经历的错误以及您的期望。并且还提供了一个。您当前的代码片段没有告诉我们太多。胡乱猜测:当您认为您正在使用弧度时,您正在使用弧度degrees@user253751Degress甚至会给出最差(超快)的旋转。@Abdelbakiboutherche感谢您的编辑,请投票!在编辑之前,没有足够的信息继续。我不熟悉GLM,但从它的外观来看,您在翻译后正在旋转。你试过先旋转吗?@humancompiler是的,它不起作用,模型开始围绕世界原点旋转,而不是本地原点。
    shader.use();
    glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCR_WIDTH/(float)SCR_HEIGHT, 0.01f, 100.0f);
    shader.setMat4f("projection", projection);

    glm::mat4 view = camera.getViewMatrix();
    shader.setMat4f("view", view);

    glm::mat4 modelm = glm::mat4(1.0f);
    modelm = glm::scale(modelm, glm::vec3(1.0f));
    modelm = glm::translate(modelm, glm::vec3(0.0f, 0.0f, -5.0f));
    // Handle x-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_x), glm::vec3(object_rotation_x, 0.0f, 0.0f));
    // Handle y-axis rotation
    modelm = glm::rotate(modelm, glm::radians(object_orientation_angle_y), glm::vec3(0.0f, object_rotation_y, 0.0f));
    shader.setMat4f("model", modelm);

    renderer.draw(model, shader);