OpenGL 2D-проекция растянута по соотношению сторон

В настоящее время я пытаюсь преобразовать методы рисования для моей 2D-игры Java в OpenGL с помощью JOGL, потому что нативная Java довольно медленная для рисования изображений с высоким разрешением в быстрой последовательности. Теперь я хочу использовать соотношение сторон 16:9, но проблема в том, что мое изображение растянуто в стороны. В настоящее время я только рисую белый вращающийся квад для тестирования этого:

public void resize(GLAutoDrawable d, int width, int height) {

    GL2 gl = d.getGL().getGL2(); // get the OpenGL 2 graphics context
    gl.glViewport(0, 0, width, height);
    gl.glMatrixMode(GL2.GL_PROJECTION);
    gl.glOrtho(-1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f);

}

public void display(GLAutoDrawable d) {

    GL2 gl = d.getGL().getGL2();  // get the OpenGL 2 graphics context
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    gl.glClear(GL.GL_COLOR_BUFFER_BIT);

    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glColor3f(1.0f,1.0f,1.0f);

    degree += 0.1f;

    gl.glRotatef(degree, 0.0f, 0.0f, 1.0f);

    gl.glBegin(GL2.GL_QUADS);
    gl.glVertex2f(-0.25f, 0.25f);
    gl.glVertex2f(0.25f, 0.25f);
    gl.glVertex2f(0.25f, -0.25f);
    gl.glVertex2f(-0.25f, -0.25f);
    gl.glEnd();

    gl.glRotatef(-degree, 0.0f, 0.0f, 1.0f);

    gl.glFlush();
}

Я знаю, что вы можете как-то решить эту проблему с помощью glOrtho(), и я попробовал много разных значений для этого сейчас, но ни одно из них не достигло растянутого изображения. Как я должен использовать это? Или есть другое простое решение для этого?

1 ответ

Решение

Матрица проекции преобразует все данные вершин из координат глаза в координаты клипа.

Затем эти координаты клипа также преобразуются в нормализованные координаты устройства (NDC) путем деления на w компонента координат клипа. Нормализованные координаты устройства находятся в диапазоне (-1, -1, -1) в (1, 1, 1),

В ортографической проекции координаты пространства глаза линейно отображаются в НЦД.

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

float aspect = (float)width/height;
gl.glOrtho(-aspect, aspect, -1.0f, 1.0f, -1.0f, 1.0f);
Другие вопросы по тегам