Почему это не квадрат? LWJGL

у меня есть базовое окно LWJGL, и я пытаюсь нарисовать квадрат, используя glBegin(GL_QUADS) метод. Square square = new Square(25, 25, 25), Так я называю свой квадратный класс, чтобы нарисовать квадрат... но это прямоугольник. Когда я называю это, я передаю все 25 в качестве параметров. первые две-начальные координаты, а последние 25-длина стороны, как показано ниже. Что я делаю не так, чтобы создать прямоугольник?

public Square(float x,float y,float sl) {
    GL11.glColor3f(0.5F, 0.0F, 0.7F);
    glBegin(GL11.GL_QUADS);
        glVertex2f(x, y);
        glVertex2f(x, y+sl);
        glVertex2f(x+sl, y+sl);
        glVertex2f(x+sl, y);
    glEnd();
}

мой код видового экрана

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); // Resets any previous projection matrices
    glOrtho(0, 640, 0, 480, 1, -1);
    glMatrixMode(GL_MODELVIEW);

2 ответов


используя glOrtho(0, 640, 0, 480, 1, -1); создает неквадратичное окно просмотра. Это означает, что отображаемый вывод, скорее всего, будет искажен, если ваше окно не имеет такого же размера, как ваш видовой экран (или, по крайней мере, такое же соотношение сторон).

рассмотрим следующее сравнение:

ortho comparison

Если ваш видовой экран имеет тот же размер, что и ваше окно, он должен оставаться квадратным. Я использую JOGL, но в мои функции изменить, я изменить мой viewport будет новым размером моего окна.

Viewport as window size

glcanvas.addGLEventListener(new GLEventListener() {
    @Override
    public void reshape(GLAutoDrawable glautodrawable, int x, int y, int width, int height) {
        GL2 gl = glautodrawable.getGL().getGL2();

        gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glLoadIdentity(); // Resets any previous projection matrices
        gl.glOrtho(0, width, 0, height, 1, -1);
        gl.glMatrixMode(GL2.GL_MODELVIEW);
    }

    ... Other methods

}

нарисовать квадрат вокруг точки (x | y) вы можете рассчитать четыре точки, которые представляют собой углы вашего квадрата.

сначала вам понадобится отношение ширины к высоте

float ratio = width / height

Я буду использовать defaultSize для длины кратчайшего пути от точки до любой из сторон.

тогда вы можете рассчитать четыре значения, как так:

float a = x + defaultSize 
float b = ratio * (y + defaultSize) 
float c = x - defaultSize 
float d = ratio * (y - defaultSize)

С помощью которого можно представить все четыре угла, чтобы нарисовать свой квадрат. С GL_SQUAD is deprecated я буду использовать GL_TRIANGLE.

glBegin(GL_TRIANGLES);
glColor3f(red, green, blue);

// upper left triangle
glVertex2f(a, b);
glVertex2f(c, b);
glVertex2f(c, d);

 // lower right triangle
glVertex2f(a, b);
glVertex2f(c, d);
glVertex2f(a, d);

glEnd();

Я не знаю, является ли это самым эффективным или идиоматическим способом сделать это, так как я только начал изучать LWJGL.