lwjgl правильно составить логику...
| |
zvx | Дата: Суббота, 02 Марта 2013, 22:08 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Подскажите, как правильно составить логику, чтобы двигались объекты. То есть надо сделать, что бы 2 объекта независимо друг от друга, вращались, увеличивались, уменьшались.
у меня происходит, что первый метод выполняется(буква Е крутиться влево и в право), но не увеличивается и уменьшается(то есть этот метод не вызывается, на экране просто ничего не происходит). Не могу понять в чем дела?
Код public class Lab2 {
Point[] point; double angleFirstLetter = 0.0; float scaleLeftLetter = 0.0F;
public void start() { try { Display.setDisplayMode(new DisplayMode(640, 480)); //set Window 640 x 480 Display.setTitle("Lab1"); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } //Init glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,10F,0,10F); glClearColor(255,0,0,1);
glMatrixMode(GL_MODELVIEW);
while (!Display.isCloseRequested()) { // render OpenGL here glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); loadObject(); pollInput(); scaleLeftLetter(); rotateLeftLetter(); Display.update(); }
Display.destroy(); }
private void loadObject (){ point = new Point[12]; for(int i = 0; i < point.length; i++) { point[i] = new Point(); } //First letter (E) point[0].x = 4F; point[0].y = 6.5F; point[1].x = 4F; point[1].y = 4.5F; point[2].x = 4F; point[2].y = 4.5F; point[3].x = 5F; point[3].y = 4.5F; point[4].x = 4F; point[4].y = 5.5F; point[5].x = 5F; point[5].y = 5.5F; point[6].x = 4F; point[6].y = 6.5F; point[7].x = 5F; point[7].y = 6.5F; //Second Letter (V) point[8].x = 6F; point[8].y = 6.5F; point[9].x = 7F; point[9].y = 4.5F; point[10].x = 7F; point[10].y = 4.5F; point[11].x = 8F; point[11].y = 6.5F; }
private void drawFirstLetter() { glColor3f(200,255,0); glBegin(GL_LINES);
for (int i = 0; i < 8; i++) glVertex2f(point[i].x, point[i].y); glEnd(); }
private void drawSecondLetter() { glColor3f(0,0,255); glBegin(GL_LINES);
for (int i = 8; i < point.length; i++) glVertex2f(point[i].x, point[i].y); glEnd(); }
private void pollInput() {
if (Mouse.isButtonDown(0)) { int x = Mouse.getX(); int y = Mouse.getY();
System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y); }
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { System.out.println("SPACE KEY IS DOWN"); }
while (Keyboard.next()) { if (Keyboard.getEventKeyState()) { if (Keyboard.getEventKey() == Keyboard.KEY_UP) { scaleLeftLetter +=0.9F; System.out.println(scaleLeftLetter); } if (Keyboard.getEventKey() == Keyboard.KEY_DOWN) { scaleLeftLetter -= 0.9F; System.out.println(scaleLeftLetter); scaleLeftLetter(); } //Rotate around left point to left if (Keyboard.getEventKey() == Keyboard.KEY_W) { angleFirstLetter += 0.9D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_E) { angleFirstLetter -= 0.9D; } } } } private void rotateLeftLetter (){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(4F,5.5F,0); glRotated(angleFirstLetter,0,0,1); glTranslatef(-4F,-5.5F,0); drawFirstLetter(); glPopMatrix(); drawSecondLetter(); } private void scaleLeftLetter(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glTranslatef(4F,5.5F,0); glScalef(scaleLeftLetter, scaleLeftLetter, 0); glTranslatef(-4F, -5.5F, 0); drawFirstLetter(); glPopMatrix(); drawSecondLetter();
}
public class Point { float x; float y; }
public static void main(String[] argv) { Lab2 app = new Lab2(); app.start(); } }
|
|
| |
TimKruz | Дата: Суббота, 02 Марта 2013, 23:02 | Сообщение # 2 |
старожил
Сейчас нет на сайте
| Цитата (zvx) у меня происходит, что первый метод выполняется(буква Е крутиться влево и в право), но не увеличивается и уменьшается(то есть этот метод не вызывается, на экране просто ничего не происходит). Не могу понять в чем дела? Оба метода выполняются, тут всё хорошо. Однако, команда glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) очищает буферы изображения и глубины, т.е., в данном случае, полностью стирает картинку. Сначала ты вызываешь scaleLeftLetter, она очищает буферы, рисует обе буквы, возвращает управление; далее идёт rotateLeftLetter, которая, в свою очередь, стирает всё, что нарисовала предыдущая функция (при чём та картинка так и не была выведена в видимый буфер), и рисует буквы уже по-своему.
Общий алгоритм можно составить по-разному, но нужно помнить, что очищение буфера обычно происходит перед прорисовкой кадра, затем буферы (видимый и задний) меняются местами и рисуется следующий кадр. При этом поворот, смещение и масштаб должны производиться один раз перед единичным вызовом прорисовки объекта, т.к. если нарисовать второй раз - это будет как бы уже другой объект (визуально). И, конечно, удобнее все эти операции делать в одной функции DrawXXX, соответствующей конкретному объекту (например, если использовать классы, то достаточно будет вызвать экземпляр_класса.draw). Ну, скажем, так: Код loadObject(); //Загрузка объектов должна производиться один раз до основного цикла while (!Display.isCloseRequested()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Очищаем буфер pollInput(); //Анализируем клаву и мышь drawLeftLetter(); //Рисуем объекты drawSecondLetter(); Display.update(); } Код private void drawFirstLetter() { glPushMatrix(); glTranslatef(4F,5.5F,0); glScalef(scaleLeftLetter, scaleLeftLetter, 0); //Масштаб glRotated(angleFirstLetter,0,0,1); //Поворот glTranslatef(-4F,-5.5F,0); //Дальше рисуем уже наш объект glColor3f(200,255,0); glBegin(GL_LINES); for (int i = 0; i < 8; i++) glVertex2f(point[i].x, point[i].y); glEnd(); glPopMatrix(); } Блок кода, начиная с glColor... и кончая glEnd можно заменить вызовом glCallList(id-списка), предварительно создав соответствующий список (тогда массив point[] можно спокойно удалить). Использование дисплейных списков удобнее и в чём-то эффективнее. Ну вот, как-то так. Не факт, что будет работать правильно, но, надеюсь, алгоритм ясен.
P.S. Оформляй код аккуратнее, и соблюдай порядок функций (например, описание drawFirstLetter логичнее расположить до основного цикла, а описание класса Point до его непосредственного использования), а то с первого раза ничего не понятно было.
Сообщение отредактировал TimKruz - Суббота, 02 Марта 2013, 23:06 |
|
| |
zvx | Дата: Воскресенье, 03 Марта 2013, 00:40 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| Большое спасибо! Теперь стало все, вроде, понятней.
Единственное, когда вызываю этот метод (drawFirstLetter();) буква сама не рисуется, то есть изначально экран пустой, пока не нажмешь на клавиатуре, чтобы вызвалось увеличение или уменьшение, только после этого появляется бука и начинают работать поворот и увлечение. С чем это может быть связано?
Извините, что код не оформлен, это так сказать черновик для испытаний)
Если, возникнут вопросы, могу я ещё тут спросить?
|
|
| |
TimKruz | Дата: Воскресенье, 03 Марта 2013, 16:58 | Сообщение # 4 |
старожил
Сейчас нет на сайте
| Цитата (zvx) Единственное, когда вызываю этот метод (drawFirstLetter();) буква сама не рисуется, то есть изначально экран пустой, пока не нажмешь на клавиатуре, чтобы вызвалось увеличение или уменьшение, только после этого появляется бука и начинают работать поворот и увлечение. С чем это может быть связано? А, ну у тебя задано изначально float scaleLeftLetter = 0.0F, а вызов glScalef(0,0,0) просто сожмёт картинку как бы в точку (возможно, невидимую). Чтобы сохранить изначальные размеры, нужно вызывать glScalef(1,1,1), для увеличения использовать значения >1, а для уменьшения - от 0 до 1, т.к. glScalef умножает матрицу координат на матрицу увеличения, основанную на выбранных значениях x, y и z. Например, glScalef(2,2,1) увеличит изображение в два раза (в плоскости экрана), а glScalef(0.5,0.5,1) - уменьшит в два раза. На счёт отрицательных значений не уверен, но, вроде бы, картинка просто перевернётся/вывернется. Цитата (zvx) Если, возникнут вопросы, могу я ещё тут спросить? Можно, конечно...
Сообщение отредактировал TimKruz - Воскресенье, 03 Марта 2013, 17:00 |
|
| |
zvx | Дата: Пятница, 22 Марта 2013, 17:36 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Теперь, все работает. Только вот есть, маленькая беда. Если я кручу объект относительно его центра, а потом захочу покрутить относительно верхней точки, то он сразу прыгает на другую координату(то есть, видно как он с одного места прыгает в другое и там только начинает крутится), а не двигается с того места где ранее производились действия. Я так понимаю, что куда то надо добавить ещё Push/Pop,но не могу понять куда.
Код package Labi;
import org.lwjgl.LWJGLException; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GL11;
import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.util.glu.GLU.gluOrtho2D;
public class Lab2 {
Point[] point; double angleFirstLetter = 0.0; float scaleFirstLetter = (float) 1; float firstDiagMove = (float) 0.0; float firstLetterGlTranslateX = 4.5F; float firstLetterGlTranslateY = 5.5F; //Varibels for second letter V double angleSecondLetter = 0.0; float scaleSecondLetter = (float) 1; float seocndDiagMove = (float) 0.0; float secondLetterGlTranslateX = 7.0F; float secondLetterGlTranslateY = 4.5F;
private void drawFirstLetter() { glPushMatrix(); glTranslatef(firstLetterGlTranslateX,firstLetterGlTranslateY,0); glRotated(angleFirstLetter,0,0,1); //Поворот glScalef(scaleFirstLetter, scaleFirstLetter, 0); //Масштаб glTranslatef(-firstLetterGlTranslateX,-firstLetterGlTranslateY,0); glTranslatef(firstDiagMove,firstDiagMove, 0); //двигаем по диаганали //Дальше рисуем уже наш объект glColor3f(200,255,0); glBegin(GL_LINES); for (int i = 0; i < 8; i++) glVertex2f(point[i].x, point[i].y); glEnd(); glPopMatrix(); }
private void drawSecondLetter() { glPushMatrix(); glTranslatef(secondLetterGlTranslateX,secondLetterGlTranslateY,0); glRotated(angleSecondLetter,0,0,1); //Поворот glScalef(scaleSecondLetter, scaleSecondLetter, 0); //Масштаб glTranslatef(-secondLetterGlTranslateX,-secondLetterGlTranslateY,0); glTranslatef(seocndDiagMove,seocndDiagMove, 0); //двигаем по диаганали //Дальше рисуем уже наш объект glColor3f(0,0,255); glBegin(GL_LINES);
for (int i = 8; i < point.length; i++) glVertex2f(point[i].x, point[i].y); glEnd(); glPopMatrix(); }
public void start() { try { Display.setDisplayMode(new DisplayMode(640, 480)); //set Window 640 x 480 Display.setTitle("Lab1"); Display.create(); } catch (LWJGLException e) { e.printStackTrace(); System.exit(0); } //Init glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,10F,0,10F); glClearColor(255,0,0,1); loadObject(); glMatrixMode(GL_MODELVIEW);
while (!Display.isCloseRequested()) { // render OpenGL here glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); pollInput(); drawFirstLetter(); drawSecondLetter(); Display.update(); }
Display.destroy(); }
public class Point { float x; float y; }
private void loadObject (){ point = new Point[12]; for(int i = 0; i < point.length; i++) { point[i] = new Point(); } //First letter (E) point[0].x = 4F; point[0].y = 6.5F; point[1].x = 4F; point[1].y = 4.5F; point[2].x = 4F; point[2].y = 4.5F; point[3].x = 5F; point[3].y = 4.5F; point[4].x = 4F; point[4].y = 5.5F; point[5].x = 5F; point[5].y = 5.5F; point[6].x = 4F; point[6].y = 6.5F; point[7].x = 5F; point[7].y = 6.5F; //Second Letter (V) point[8].x = 6F; point[8].y = 6.5F; point[9].x = 7F; point[9].y = 4.5F; point[10].x = 7F; point[10].y = 4.5F; point[11].x = 8F; point[11].y = 6.5F; }
private void pollInput() {
if (Mouse.isButtonDown(0)) { int x = Mouse.getX(); int y = Mouse.getY();
System.out.println("MOUSE DOWN @ X: " + x + " Y: " + y); }
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { System.out.println("SPACE KEY IS DOWN"); }
while (Keyboard.next()) { if (Keyboard.getEventKeyState()) { // if (Keyboard.getEventKey() == Keyboard.KEY_UP) { // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // glTranslatef(0, 0.9F, 0); // drawFirstLetter(); // drawSecondLetter(); // } if (Keyboard.getEventKey() == Keyboard.KEY_UP) { //увеличение относительно центра scaleFirstLetter +=0.9F; System.out.println(scaleFirstLetter); } if (Keyboard.getEventKey() == Keyboard.KEY_DOWN) { //уменьшение относительно центра scaleFirstLetter -= 0.9F; System.out.println(scaleFirstLetter); //scaleLeftLetter(); } if (Keyboard.getEventKey() == Keyboard.KEY_LEFT) { firstDiagMove+=1F; } if (Keyboard.getEventKey() == Keyboard.KEY_RIGHT) { firstDiagMove-=1F; } //Rotate around top point if (Keyboard.getEventKey() == Keyboard.KEY_Q) {
} //Rotate around left point to left if (Keyboard.getEventKey() == Keyboard.KEY_W) { //вращение относительно центра firstLetterGlTranslateX = 4.5F; firstLetterGlTranslateY = 5.5F; angleFirstLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_E) { firstLetterGlTranslateX = 4.5F; //вращение относительно центра firstLetterGlTranslateY = 5.5F; angleFirstLetter -= 5.0D; } //Rotate around left point to left if (Keyboard.getEventKey() == Keyboard.KEY_R) { //вращение самой верхней точки firstLetterGlTranslateX = 4.5F; firstLetterGlTranslateY = 6.5F; angleFirstLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_T) { firstLetterGlTranslateX = 4.5F; //вращение самой верхней точки firstLetterGlTranslateY = 6.5F; angleFirstLetter -= 5.0D; } if (Keyboard.getEventKey() == Keyboard.KEY_Y) { //вращение самой левой точки firstLetterGlTranslateX = 4.0F; firstLetterGlTranslateY = 5.5F; angleFirstLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_U) { firstLetterGlTranslateX = 4.0F; //вращение самой левой точки firstLetterGlTranslateY = 5.5F; angleFirstLetter -= 5.0D; } //Control for Second Letter V//////////////////////////////////////////////////////// if (Keyboard.getEventKey() == Keyboard.KEY_Z) { //увеличение относительно центра scaleSecondLetter +=0.5F; System.out.println(scaleSecondLetter); } if (Keyboard.getEventKey() == Keyboard.KEY_X) { //уменьшение относительно центра scaleSecondLetter -= 0.5F; System.out.println(scaleSecondLetter); } if (Keyboard.getEventKey() == Keyboard.KEY_C) { seocndDiagMove+=1F; } if (Keyboard.getEventKey() == Keyboard.KEY_V) { seocndDiagMove-=1F; } //Rotate around left point to left if (Keyboard.getEventKey() == Keyboard.KEY_A) { //вращение относительно центра secondLetterGlTranslateX = 7.0F; secondLetterGlTranslateY = 5.5F; angleSecondLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_S) { secondLetterGlTranslateX = 7.0F; //вращение относительно центра secondLetterGlTranslateY = 5.5F; angleSecondLetter -= 5.0D; } //Rotate around left point to left if (Keyboard.getEventKey() == Keyboard.KEY_D) { //вращение самой верхней точки secondLetterGlTranslateX = 7.0F; secondLetterGlTranslateY = 6.5F; angleSecondLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_F) { secondLetterGlTranslateX = 7.0F; //вращение самой верхней точки secondLetterGlTranslateY = 6.5F; angleSecondLetter -= 5.0D; } if (Keyboard.getEventKey() == Keyboard.KEY_G) { //вращение самой левой точки secondLetterGlTranslateX = 6.0F; secondLetterGlTranslateY = 6.5F; angleSecondLetter += 5.0D; } //Rotate around left point to rigth if (Keyboard.getEventKey() == Keyboard.KEY_H) { secondLetterGlTranslateX = 6.0F; //вращение самой левой точки secondLetterGlTranslateY = 6.5F; angleSecondLetter -= 5.0D; } } } }
public static void main(String[] argv) { Lab2 app = new Lab2(); app.start(); } }
|
|
| |
|