Вращение OpenGL в 2D

У меня есть простое приложение OpenGL, которое отображает строку. Я храню x1, y1, x2 и y2 в глобальных переменных.

Функция поворота использует функциональность feedback, обсуждаемую здесь и метод перевода в источник, предложенный здесь. Он предназначен для вращения линии вокруг ее центра.

Вот код:


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?


person Mihai Rotaru    schedule 06.12.2010    source источник


Ответы (1)


Мне кажется, что вы переводите в неправильном направлении, и источник находится за пределами вашего окна просмотра в левом нижнем углу. Вы хотите переместить исходную точку в точку, которую хотите перевести, поэтому, если исходная точка находится в левом нижнем углу, вам нужно перевести +center_x, +center_y. Повернуть, перевести назад (-center_x, -center_y), затем нарисовать.

person Justin W    schedule 06.12.2010
comment
Действительно, теперь работает, спасибо! Однако по мере вращения линия медленно перемещается в нижний левый угол окна; этого можно избежать? - person Mihai Rotaru; 06.12.2010
comment
У вас есть два разных центра: центр окна просмотра и середина линии. Я предполагаю, что вы хотите, чтобы середина линии находилась в центре окна просмотра. Итак, что вы действительно хотите сделать, так это перевести в центр окна просмотра, повернуть и нарисовать линию относительно перемещенного источника (то есть линии, средняя точка которой равна 0,0). - person Justin W; 06.12.2010
comment
хорошо, но есть проблема, когда новые координаты (полученные в результате переводов + поворот) попадают за пределы видимой области. В этом случае буфер обратной связи будет содержать только видимые точки. Когда я поворачиваюсь назад, линия обрезается, и я хотел бы вернуть свою линию неповрежденной. - person Mihai Rotaru; 15.02.2011