Растягивание рисунка в OpenGL ES - iOS - PullRequest
0 голосов
/ 09 августа 2011

Я пытаюсь нарисовать простой круг, используя OpenGL ES. Проблема в том, что круг вытянут вертикально. Это больше похоже на эллипс, чем на круг. Может ли кто-нибудь указать, где все идет не так?

Я поигрался с glViewPort, чтобы исправить это, но безуспешно. Как кто-то еще предложил здесь, в Stackoverflow, я также попытался загрузить другую матрицу вместо матрицы идентификаторов, и это тоже не работает ...

Вот код drawFrame:

- (void)drawFrame
{
    [(EAGLView *)self.view setFramebuffer];

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();       

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);   

    GLfloat vertices[720];
    for (int i = 0; i < 720; i += 2) 
    {
        vertices[i]   = (cos(degreesToRadians(i)) * 1);
        vertices[i+1] = (sin(degreesToRadians(i)) * 1);
    }

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 360);

    [(EAGLView *)self.view presentFramebuffer];
}

1 Ответ

2 голосов
/ 10 августа 2011

Код, который вы показываете, нарисует идеальный круг в мировых координатах. Вам нужно учитывать, как эти мировые координаты преобразуются в оконные координаты, то есть в пиксели.

Если glViewport установлен так, чтобы всегда соответствовать окну, то соотношение сторон окна будет определять то, что вы видите, используя пример кода, который вы показали. Если окно квадратное, оно будет работать, т.е. вы увидите идеальный круг. Если окно выше, чем оно широко, то круг будет вытянут по вертикали.

Для сохранения идеального круга вы можете использовать проекционную матрицу, которая дает вам объем просмотра с тем же соотношением сторон, что и у окна / окна просмотра. Я заметил, что перед первым редактированием у вас там был звонок на glOrthof. Установите соотношение сторон, чтобы соответствовать, и это сделает работу за вас. Если вы хотите использовать перспективную проекцию вместо ортографической, используйте glFrustum.

...