c++ - 使用 GLM 围绕点进行 OpenGL 旋转

标签 c++ opengl rotation quaternions glm-math

我一直在阅读其他关于如何通过将枢轴平移到原点、旋转以及向后平移来围绕 OpenGL 中的点旋转对象的文章。但是,我似乎无法让它发挥作用。我有一个立方体,并使用 glm::perspective 和 glm::lookAt 来生成投影和 View 矩阵。

glm::mat4 Projection = glm::perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
// Camera matrix
glm::mat4 View       = glm::lookAt(
                                   glm::vec3(0,3.5,-5),
                                   glm::vec3(0,0,0), 
                                   glm::vec3(0,1,0)  
                                   );
// Model matrix : an identity matrix (model will be at the origin)
glm::mat4 Model      = glm::mat4(1.0f);

然后我在 while 循环内对模型矩阵应用转换,如下所示:

    if (glfwGetKeyOnce(window, GLFW_KEY_UP))
    {
        Model = translate(Model, vec3(1.0f, 0.0f, 0.0f));
        Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f));
        Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f));
    }
    mat4 MVP = Projection * View * Model;

在我的顶点着色器中,我有这个:

gl_Position =  MVP * vec4(vertexPosition_modelspace,1);

但是,这仍然只是使立方体绕其中心旋转。如果我摆脱对 glm::translate 的调用,而是通过调整顶点的 x 位置进行平移,则它可以正常工作。但我认为这不是正确的做法。我在这里缺少什么?

最佳答案

if (glfwGetKeyOnce(window, GLFW_KEY_UP))
{
    Model = translate(Model, vec3(1.0f, 0.0f, 0.0f));
    Model = rotate(Model, 90.0f, vec3(1.0f, 0.0f, 0.0f));
    Model = translate(Model, vec3(-1.0f, 0.0f, 0.0f));
}
mat4 MVP = Projection * View * Model;

尝试用“竖起大拇指的手”来可视化这段代码。拇指是 x 轴。首先举起手,然后绕圈走,最后放下手。

您很可能想绕另一个轴旋转。

请记住,还有更现代的方法可以进行旋转,例如四元数。这将为您节省大量操作。

关于c++ - 使用 GLM 围绕点进行 OpenGL 旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961471/

相关文章:

c++ - 数据结构中的 MST 和唯一性问题已解决 Ex?

c++ - 我如何在 Linux Ubuntu 14.04 LTS 上设置 freeglut 库

math - 如何从 OpenGL ModelView 矩阵获取 View 方向?

c++ - 在具有多重采样的 QGLFramebufferObject 中使用 sRGB 颜色

ios - CABasicAnimation 如何获取当前的旋转角度

java - Java中如何在保持大小的情况下进行旋转?

C++ MySql 获取最后插入的id

c++ - 获取错误的 Char 变量数

c++ - 在 C++ 中,我们无法在没有初始化的情况下声明引用。为什么?

opengl - 同一程序中可以有多个像素(片段)着色器吗?