Попытка визуализировать круг в OpenGLES 1.1, делает овал - PullRequest
2 голосов
/ 26 марта 2010

Я пытался визуализировать круг в opengles 1.1 в качестве теста перед сборкой более крупной программы, но он рендерился как овал. Вот код, который я использую для генерации и рендеринга моих вершин:

static const int numVerts = 40;

static GLfloat myFirstCircle[82];

myFirstCircle[0] = 0.0f;
myFirstCircle[1] = 0.0f;

for (int i = 2; i < (numVerts+1)*2; i+=2) {
    myFirstCircle[i] = .5 * cosf(i*2*3.14159/numVerts);
    myFirstCircle[i+1] = .5 * sinf(i*2*3.14159/numVerts);
}

glVertexPointer(2, GL_FLOAT, 0, myFirstCircle);
glEnableClientState(GL_VERTEX_ARRAY);

glDrawArrays(GL_TRIANGLE_FAN, 0, 22);

Я все еще немного новичок в этой системе, поэтому у меня может быть глупая ошибка, которую я не вижу, но мне кажется, что это должно генерировать 40 вершин на окружности радиуса .5. При рендеринге фигура на экране выглядит овальной, значительно выше ее ширины.

Мой вопрос таков: почему мой круг рендерит таким образом, и что я мог сделать, чтобы это исправить? Это первый вопрос по stackoverflow, поэтому я не уверен, как поделиться изображением моего вывода.

Ответы [ 3 ]

2 голосов
/ 26 марта 2010

Вы должны настроить матрицу проекции в соответствии с пропорциями экрана. Как и сейчас, все края экрана имеют + -1,0, что вызывает растяжение в длинном измерении Эта маленькая пустышка устанавливает верхний и нижний края на + -1,5.

glMatrixMode(GL_PROJECTION);
glOrthof(-1.0, 1.0, -1.5, 1.5, 1, 100);
0 голосов
/ 26 марта 2010

Если вы хотите оставить свою перспективу такой же, какой она была для начала, проще всего будет сказать

glScalef(1, 1.0/1.5, 1);

Я бы, вероятно, сделал это с матрицей проекции (скажем, glMatrixMode (GL_PROJECTION); до шкалы)

0 голосов
/ 26 марта 2010

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

В обычном OpenGL вы, вероятно, сделали бы это следующим образом:

gluPerspective(45.0f, 320.0f/480.0f, 0.1f,100.0f);

Поле зрения 90 градусов (45 * 2), близкое к отсечению 0,1, дальнее отсечение 100 и где разрешение вашего экрана составляет 320 пикселей в ширину и 480 пикселей в высоту. Конечно, эта функция не существует в ES, поэтому вам нужно будет сделать это вручную.

Кто-то любезно разместил код, чтобы заменить его здесь:

http://maniacdev.com/2009/05/opengl-gluperspective-function-in-iphone-opengl-es/

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ Codewarrior опубликовал код, если вы делаете ортографическую проекцию, скорее всего для 2D-приложения. Этот код предназначен для перспективной 3D-игры с более реалистичной глубиной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...