如何在openGL中旋转图像?

Posted

技术标签:

【中文标题】如何在openGL中旋转图像?【英文标题】:How to rotate an image in openGL? 【发布时间】:2016-03-09 04:01:02 【问题描述】:

我在 C++ OpenGL 中有一段代码。它有六个三角形,形成六边形。 但是,我需要能够垂直旋转它。 有人可以帮忙吗? TNX

详细信息:我有六个带顶点的独立三角形。此外,还有用于颜色的二维数组。 有一个循环从 [here] 行开始,两个保持窗口渲染直到它退出。 [here-two] 处的另一行用于显示所有三角形及其颜色。

    //coordinates of triangle
    float triangle[6][9] = 
        
            0.0, 0.0, 0.0,
            -0.5, 0.87, 0.0,
            0.5, 0.87, 0.0
        ,
        
            0.0, 0.0, 0.0,
            -0.5, -0.87, 0.0,
            0.5, -0.87, 0.0
        ,
        
            0.0, 0.0, 0.0,
            0.5, 0.87, 0.0,
            1.0, 0.0, 0.0
        ,
        
            0.0, 0.0, 0.0,
            0.5, -0.87, 0.0,
            1.0, 0.0, 0.0
        ,
        
            0.0, 0.0, 0.0,
            -0.5, 0.87, 0.0,
            -1.0, 0.0, 0.0
        ,
        
            0.0, 0.0, 0.0,
            -0.5, -0.87, 0.0,
            -1.0, 0.0, 0.0
        

    ;

    float color[][9]
        
            255, 0, 0,
            255, 0, 0,
            255, 0, 0
        ,
        
            0, 255, 0,
            0, 255, 0,
            0, 255, 0
        ,
        
            0, 0, 255,
            0, 0, 255,
            0, 0, 255
        
    ;
    int count = 0;

    /* Loop until the user closes the window */ [here]      while (!glfwWindowShouldClose(window))
    
        glClear(GL_COLOR_BUFFER_BIT);
 [here-two]             for (int i = 0; i < 6; i++)
        
            //Render OpenGL here
            glEnableClientState(GL_VERTEX_ARRAY);
            glEnableClientState(GL_COLOR_ARRAY);
            glVertexPointer(3, GL_FLOAT, 0, triangle[i]);
            glColorPointer(3, GL_FLOAT, 0, color[count]);
            glDrawArrays(GL_TRIANGLES, 0, 3);
            glDisableClientState(GL_COLOR_ARRAY);
            glDisableClientState(GL_VERTEX_ARRAY);
            count++;
            if (count > 2) count = 0;
        
        //Swap front and back buffers
        glfwSwapBuffers(window);

        //Poll for and process events
        glfwPollEvents();

        // Poll for and process events
        glfwPollEvents();
    

【问题讨论】:

请看这个问题的答案:***.com/questions/9110968/rotate-triangle-in-opengl 【参考方案1】:

阅读矩阵的使用。大多数游戏在这种情况下所做的就是在着色器中应用一个矩阵(作为一个统一变量)来旋转对象。在这种情况下,您将创建一个角度为 x 的旋转矩阵,将其传递给着色器,然后每个新帧递增 x 并再次将其传递给着色器。

有关实施细节的更多信息,请阅读以下内容:

https://www.opengl.org/wiki/Uniform_(GLSL) - 创建制服 着色器中的变量并更新它们

http://inside.mines.edu/fs_home/gmurray/ArbitraryAxisRotation/ - 创建一个将旋转顶点的矩阵。

还有一个关于矩阵运算的提示:记住以正确的顺序应用它们。如果你想让对象围绕它的中心旋转,请确保首先应用旋转矩阵并且你的网格的原点是它的中心。

【讨论】:

以上是关于如何在openGL中旋转图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何将部分纹理复制到opengl中的图像

在opengl中找到旋转的图像中心

如何根据对象的本地位置/旋转在 OpenGL 中移动/旋转对象

如何在 OpenGL 中围绕 Z 轴中心旋转对象?

无法在openGL中围绕它的中心旋转我的图像

如何在 OpenGL 中更改旋转中心