Почему это не квадрат? 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);
создает неквадратичное окно просмотра. Это означает, что отображаемый вывод, скорее всего, будет искажен, если ваше окно не имеет такого же размера, как ваш видовой экран (или, по крайней мере, такое же соотношение сторон).
рассмотрим следующее сравнение:
Если ваш видовой экран имеет тот же размер, что и ваше окно, он должен оставаться квадратным. Я использую JOGL, но в мои функции изменить, я изменить мой viewport будет новым размером моего окна.
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.