2D 中的 OpenGL 旋转

Posted

技术标签:

【中文标题】2D 中的 OpenGL 旋转【英文标题】:OpenGL rotation in 2D 【发布时间】:2010-12-06 09:36:12 【问题描述】:

我有一个简单的 OpenGL 应用程序,它显示一条线。我将x1, y1, x2y2 存储在全局变量中。

旋转功能使用feedback 功能,讨论here 和转换到原点方法,建议here。它旨在围绕其中心旋转一条线。

代码如下:


void rotate( float theta )


    GLfloat* buff = new GLfloat[5];
    glFeedbackBuffer( 5, GL_2D, buff );
    glRenderMode( GL_FEEDBACK );

    int center_x = x1 + ( x2 - x1 )/2;
    int center_y = y1 + ( y2 - y1 )/2;

    glPushMatrix();
        glTranslatef( -center_x, -center_y, 0 );
        glRotatef( theta, 0, 0, 1 );
        glTranslatef( center_x, center_y, 0 );
        line();
    glPopMatrix();

    x1 = (int)buff[1];
    y1 = (int)buff[2];
    x2 = (int)buff[3];
    y2 = (int)buff[4];

    delete[] buff;
    glutPostRedisplay();

但是,这两种翻译似乎效果不大 - 线仍然围绕窗口的左下角旋转。此外,如果线条不适合可见表面,则会被剪裁(注释掉的翻译不会发生这种情况 - 如果线条落在可见表面之外,则会拒绝移动)。

为什么这段代码不起作用?如何在 2D 中围绕其中心(或任意点)旋转一条线?

【问题讨论】:

【参考方案1】:

在我看来,您的平移方向错误,并且原点位于左下角的视口之外。你想把原点移动到你想要平移的点——所以如果原点在左下角,你需要平移+center_x,+center_y。旋转,向后平移(-center_x,-center_y),然后绘制。

【讨论】:

确实,现在可以了,谢谢!然而,随着它的旋转,这条线慢慢地移向窗口的左下角;这可以避免吗? 你有两个不同的中心要处理:视口的中心和线的中点。我假设您希望线的中点在视口中居中。所以你真正想做的是平移到视口的中心,旋转并相对于平移的原点(即中点为 0,0 的线)绘制线。 好的,但是当新坐标(由平移+旋转产生)落在可见区域之外时会出现问题。如果是这种情况,反馈缓冲区将只包含可见点。当我旋转回来时,线条被剪断 - 我希望我的线条完好无损。

以上是关于2D 中的 OpenGL 旋转的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 2D敌人不旋转面对玩家

OpenGL 2D 圆 - 旋转 AABB 碰撞

旋转使用 OpenGL 绘制的 2D 对象

OpenGL 旋转 2D 纹理

使用 OpenGL 固定功能旋转和平移 2D 图像

围绕对象中心的 2d OpenGL 旋转