Так, как lwjgl использует opengl api для вывода графики, вам нужно знать о матрицах.
В нашем случае графика в 2D, а значит матрица будет называться "matrix ortho".
Но как создать эту матрицу?
То есть, как задать текущую матрицу?
Для этого есть метод:
GL11.glMatrixMode();
С помощью него можно задавать матрицы, которые нам нужны.
В нашем случае будуть использоваться следующие матрицы:
GL_MODELVIEW - видовое пространство.
GL_PROJECTION
и единичная матрица, вызывается с помощью метода
GL11.glLoadIdentity();
После всех этих непонятных штук нам пригодится метод
GL11.glOrtho(left, right, bottom, top, zNear, zFar);
Обычно этот метод вызвается с функциями:
left = 0.0D;
right = Display.getWidth();
bottom = 0.0D;
top = Display.getHeight();
zNear = -1.0D;
zFar = 1.0D;
После создания матрицы уже можно рисовать.
Но, для до рисования нужно очистить буффер цвета для перерисовки содержимого в окне.
Это делается так:
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
И вызывается единичная матрица:
GL11.glLoadIdentity();
Ну вот и все! Теперь можно рисовать.
Для начала нам нужно выбрать метод рисования(треугольниками, квадратами, линиями или полигонами).
Чтобы рисовать квадратами, нужно вызвать метод:
GL11.glBegin(GL11.GL_QUADS);
Или же треугольниками:
GL11.GL_TRIANGLES);
Ну, вы решили метод рисования, но как рисовать!?
Для этого есть специальный метод
для 2D
GL11.glVertex2f(x, y);
для 3D
GL11.glVertex3f(x, y, z);
Эти методы задают координаты точек для соединения и преобразования их в квадраты, линии или треугольники.
Например, я рисую квадрат:
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0.0F, 0.0F); // точка в координатах 0, 0.
GL11.glVertex2f(50.0F, 0.0f); // точка в координатах 50 , 0.
GL11.glVertex2f(50.0F, 50.0F) // точка в координатах 50, 50.
GL11.glVertex2f(0.0F, 50.0F); // точка в координатах 0, 50.
GL11.glEnd(); // конец рисования
В этом случае создаются четыре вершины и уже потом создается квадрат.
Но после рисования квадрата он по-умолчанию появляется в координатах 0, 0.
Как же его переместить в середину окна?
Для этого служит специальный метод
GL11.glTranslatef(x, y, z);
В 2D мире координата z = 0.0F;
Переместим квадрат
GL11.glTranslatef(200.0F, 300.0F, 0.0f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0.0F, 0.0F); // точка в координатах 0, 0.
GL11.glVertex2f(50.0F, 0.0f); // точка в координатах 50 , 0.
GL11.glVertex2f(50.0F, 50.0F) // точка в координатах 50, 50.
GL11.glVertex2f(0.0F, 50.0F); // точка в координатах 0, 50.
GL11.glEnd(); // конец рисования
Но если мы нарисуем еще один квадрат, то они все будут в координатах 0, 0.
Почему так происходит?
Потому, что мы не сохраняем текущую матрицу!
Делается это так:
GL11.glPushMatrix();
Потом после рисования квадрата мы закрываем матрицу
GL11.glPopMatrix();
Чтобы изменить цвет квадрата есть метод
GL11.glColor3f(g, r, b);
Чтобы восстановить цвет по-умолчанию, нужно сделать так:
GL11.glColor3f(1.0F, 1.0F, 1.0F);
Весь код:
В нашем случае графика в 2D, а значит матрица будет называться "matrix ortho".
Но как создать эту матрицу?
То есть, как задать текущую матрицу?
Для этого есть метод:
GL11.glMatrixMode();
С помощью него можно задавать матрицы, которые нам нужны.
В нашем случае будуть использоваться следующие матрицы:
GL_MODELVIEW - видовое пространство.
GL_PROJECTION
и единичная матрица, вызывается с помощью метода
GL11.glLoadIdentity();
После всех этих непонятных штук нам пригодится метод
GL11.glOrtho(left, right, bottom, top, zNear, zFar);
Обычно этот метод вызвается с функциями:
left = 0.0D;
right = Display.getWidth();
bottom = 0.0D;
top = Display.getHeight();
zNear = -1.0D;
zFar = 1.0D;
После создания матрицы уже можно рисовать.
Но, для до рисования нужно очистить буффер цвета для перерисовки содержимого в окне.
Это делается так:
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
И вызывается единичная матрица:
GL11.glLoadIdentity();
Ну вот и все! Теперь можно рисовать.
Для начала нам нужно выбрать метод рисования(треугольниками, квадратами, линиями или полигонами).
Чтобы рисовать квадратами, нужно вызвать метод:
GL11.glBegin(GL11.GL_QUADS);
Или же треугольниками:
GL11.GL_TRIANGLES);
Ну, вы решили метод рисования, но как рисовать!?
Для этого есть специальный метод
для 2D
GL11.glVertex2f(x, y);
для 3D
GL11.glVertex3f(x, y, z);
Эти методы задают координаты точек для соединения и преобразования их в квадраты, линии или треугольники.
Например, я рисую квадрат:
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0.0F, 0.0F); // точка в координатах 0, 0.
GL11.glVertex2f(50.0F, 0.0f); // точка в координатах 50 , 0.
GL11.glVertex2f(50.0F, 50.0F) // точка в координатах 50, 50.
GL11.glVertex2f(0.0F, 50.0F); // точка в координатах 0, 50.
GL11.glEnd(); // конец рисования
В этом случае создаются четыре вершины и уже потом создается квадрат.
Но после рисования квадрата он по-умолчанию появляется в координатах 0, 0.
Как же его переместить в середину окна?
Для этого служит специальный метод
GL11.glTranslatef(x, y, z);
В 2D мире координата z = 0.0F;
Переместим квадрат
GL11.glTranslatef(200.0F, 300.0F, 0.0f);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0.0F, 0.0F); // точка в координатах 0, 0.
GL11.glVertex2f(50.0F, 0.0f); // точка в координатах 50 , 0.
GL11.glVertex2f(50.0F, 50.0F) // точка в координатах 50, 50.
GL11.glVertex2f(0.0F, 50.0F); // точка в координатах 0, 50.
GL11.glEnd(); // конец рисования
Но если мы нарисуем еще один квадрат, то они все будут в координатах 0, 0.
Почему так происходит?
Потому, что мы не сохраняем текущую матрицу!
Делается это так:
GL11.glPushMatrix();
Потом после рисования квадрата мы закрываем матрицу
GL11.glPopMatrix();
Чтобы изменить цвет квадрата есть метод
GL11.glColor3f(g, r, b);
Чтобы восстановить цвет по-умолчанию, нужно сделать так:
GL11.glColor3f(1.0F, 1.0F, 1.0F);
Весь код:
import java.util.logging.Level;
import java.util.logging.Logger;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;
import org.lwjgl.util.glu.GLU;
public final class SimpleProgram
{
private SimpleProgram()
{
}
private void initialize()
{
this.createDisplay(800, 600, "SimpleProgram");
this.createMatrixOrtho();
this.running();
}
private void createDisplay(int width, int height, String title)
{
try
{
Display.setDisplayMode(new DisplayMode(width, height));
Display.setTitle(title);
Display.create();
}
catch (LWJGLException ex)
{
Logger.getLogger(SimpleProgram.class.getName()).log(Level.SEVERE, null, ex);
this.clearResources(true);
}
}
private void createMatrixOrtho()
{
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0.0D, (double) Display.getWidth(), 0.0D, (double) Display.getHeight(), -1.0D, 1.0D);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
}
private void running()
{
while (!Display.isCloseRequested())
{
this.displayUpdate();
}
this.clearResources(false);
}
private void displayUpdate()
{
GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
GL11.glLoadIdentity();
GL11.glColor3f(0.0F, 1.0F, 0.0F);
GL11.glPushMatrix();
GL11.glTranslatef(200.0F, 300.0F, 0.0F);
GL11.glBegin(GL11.GL_QUADS);
GL11.glVertex2f(0.0F, 0.0F);
GL11.glVertex2f(50.0F, 0.0f);
GL11.glVertex2f(50.0F, 50.0F);
GL11.glVertex2f(0.0F, 50.0F);
GL11.glEnd();
GL11.glPopMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glPushMatrix();
GL11.glTranslatef(100.0F, 200.0F, 0.0F);
GL11.glBegin(GL11.GL_QUADS);
GL11.glColor3f(1.0F, 0.0F, 0.0F);
GL11.glVertex2f(0.0F, 0.0F);
GL11.glColor3f(0.0F, 1.0F, 0.0F);
GL11.glVertex2f(50.0F, 0.0f);
GL11.glColor3f(0.0F, 0.0F, 1.0F);
GL11.glVertex2f(50.0F, 50.0F);
GL11.glColor3f(1.0F, 1.0F, 1.0F);
GL11.glVertex2f(0.0F, 50.0F);
GL11.glEnd();
GL11.glPopMatrix();
GL11.glColor3f(1.0F, 1.0F, 1.0F);
Display.update();
Display.sync(60);
}
private void clearResources(boolean hasCrash)
{
System.out.println(GLU.gluErrorString(GL11.glGetError()));
Display.destroy();
System.exit(hasCrash ? 1 : 0);
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
new SimpleProgram().initialize();
}
}
Чтобы изменить цвет фона, нужно вызвать один раз метод
ОтветитьУдалитьGL11.glClearColor(r, g, b, alpha);
Аргументы: r, g, b - единичные. alpha равна 0 или 1.
Удалить