LWJGL 3D Basic
| |
wawe | Дата: Четверг, 16.08.2012, 21:44 | Сообщение # 1 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| Code import java.nio.*; import java.util.*;
import org.lwjgl.*; import org.lwjgl.opengl.*; import org.lwjgl.util.vector.*; import org.lwjgl.input.*; import org.lwjgl.util.glu.*;
public class Main {
// вызываем Random Random r = new Random();
// вызываем Elements
// создаем rotate float rotation = 0;
// время прыжка final double TIME_STEP = 1 / 90.; // гравитация final double GRAVITY = 0.5; boolean jumping; double yPosition; double yVelocity;
private Vector3f position = null; private float yaw = 0.0f; private float pitch = 0.0f;
// в конструкторе мы создаем координаты позиции камеры X, Y и Z public Main(float x, float y, float z) { position = new Vector3f(x, y, z); }
// пока ничего не указываем public Main() { }
// уклон от курса public void yaw(float amount) { yaw += amount; }
// делаем подачу public void pitch(float amount) { pitch -= amount; }
// в этом методе мы создаем управление камеры public void walkForward(float distance) { position.x -= distance * (float) Math.sin(Math.toRadians(yaw)); position.z += distance * (float) Math.cos(Math.toRadians(yaw));
// делаем так, чтобы камера не выходила за пределы этих координат 75 -75 if (position.x > 75) { position.x = 75; } if (position.x < -75) { position.x = -75; } if (position.z > 75) { position.z = 75; } if (position.z < -75) { position.z = -75; } }
public void walkBackwards(float distance) { position.x += distance * (float) Math.sin(Math.toRadians(yaw)); position.z -= distance * (float) Math.cos(Math.toRadians(yaw)); if (position.x > 75) { position.x = 75; } if (position.x < -75) { position.x = -75; } if (position.z > 75) { position.z = 75; } if (position.z < -75) { position.z = -75; } }
public void strafeLeft(float distance) { position.x -= distance * (float) Math.sin(Math.toRadians(yaw - 90)); position.z += distance * (float) Math.cos(Math.toRadians(yaw - 90)); if (position.x > 75) { position.x = 75; } if (position.x < -75) { position.x = -75; } if (position.z > 75) { position.z = 75; } if (position.z < -75) { position.z = -75; } }
public void strafeRight(float distance) { position.x -= distance * (float) Math.sin(Math.toRadians(yaw + 90)); position.z += distance * (float) Math.cos(Math.toRadians(yaw + 90)); if (position.x > 75) { position.x = 75; } if (position.x < -75) { position.x = -75; } if (position.z > 75) { position.z = 75; } if (position.z < -75) { position.z = -75; } }
// прыжок public void jump(float distance) { position.y -= distance * (float) Math.cos(Math.toRadians(yaw + 90)); if (position.y > 0) { position.y = 0; } }
public void lookThrough() { // вражение камеры в разные стороны GL11.glRotatef(pitch, 1.0f, 0.0f, 0.0f); GL11.glRotatef(yaw, 0.0f, 0.1f, 0.0f); GL11.glTranslatef(position.x, position.y, position.z); }
// игра работает private static boolean gameRunning = true; // ширина окна private static int targetWidth = 800; // высота окна private static int targetHeight = 600;
// полноэкранный режим private static void initDisplay(boolean fullscreen) {
DisplayMode chosenMode = null;
try { DisplayMode[] modes = Display.getAvailableDisplayModes();
for (int i = 0; i < modes.length; i++) { if ((modes[i].getWidth() == targetWidth) && (modes[i].getHeight() == targetHeight)) { chosenMode = modes[i]; break; } } } catch (LWJGLException e) { Sys.alert("Error", "Unable to determine display modes."); System.exit(0); }
if (chosenMode == null) { Sys.alert("Error", "Unable to find appropriate display mode."); System.exit(0); }
try { Display.setDisplayMode(chosenMode); Display.setFullscreen(fullscreen); Display.setTitle("Название игры"); Display.create();
} catch (LWJGLException e) { Sys.alert("Error", "Unable to create display."); System.exit(0); } }
// это по моему самое главное, что должно быть в хорошей игре // здесь вы можете изменять освещение, шейдеры, все что вам только захочется // только и опыт здесь нужен=) private static boolean initGL() { GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GLU.gluPerspective(/* искажение 3D */45.0f, ((float) /* * это число должно * совпадать с * размерами ширины * окна */800) / ((float) /* * это число должно совпадать с размерами высоты * окна */600), 0.1f, /* дальность видимости */10000000000000000000.0f); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity();
// создаем освещение объектов GL11.glShadeModel(GL11.GL_SMOOTH); GL11.glClearDepth(1.0f); GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glDepthFunc(GL11.GL_LEQUAL); GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
// здесь указывается цвет освещения // можете изменять числа, экспериментируйте=) float lightAmbient[] = { 0.5f, 0.5f, 0.5f, 10.0f }; // Values float lightDiffuse[] = { 0.5f, 0.5f, 0.5f, 10.0f }; // Values float lightPosition[] = { 0.5f, 0.5f, 0.5f, 10.0f };
ByteBuffer temp = ByteBuffer.allocateDirect(16); temp.order(ByteOrder.nativeOrder()); GL11.glLight(GL11.GL_LIGHT1, GL11.GL_AMBIENT, (FloatBuffer) temp .asFloatBuffer().put(lightAmbient).flip()); // Setup The Ambient // Light GL11.glLight(GL11.GL_LIGHT1, GL11.GL_DIFFUSE, (FloatBuffer) temp .asFloatBuffer().put(lightDiffuse).flip()); // Setup The Diffuse // Light GL11.glLight(GL11.GL_LIGHT1, GL11.GL_POSITION, (FloatBuffer) temp .asFloatBuffer().put(lightPosition).flip()); // Position The // Light GL11.glEnable(GL11.GL_LIGHT1);
return true; }
private void run() { // указываем, где должна появится камера X, Y, Z Main camera = new Main(10, -100, -10);
float dx = 0.0f; float dy = 2.0f; float dt = 5.0f;
float mouseSensitivity = 0.15f; float movementSpeed = 10.0f;
// скрытие пиктограммы мыши Mouse.setGrabbed(true); while (gameRunning) { render(); Display.update(); dt = 0.0015f; dx = Mouse.getDX(); dy = Mouse.getDY();
camera.yaw(dx * mouseSensitivity); camera.pitch(-dy * mouseSensitivity);
// вперед if (Keyboard.isKeyDown(Keyboard.KEY_W))// move forward { camera.walkForward(movementSpeed * dt); } // назад if (Keyboard.isKeyDown(Keyboard.KEY_S))// move backwards { camera.walkBackwards(movementSpeed * dt); } // влево if (Keyboard.isKeyDown(Keyboard.KEY_A))// strafe left { camera.strafeLeft(movementSpeed * dt); } // вправо if (Keyboard.isKeyDown(Keyboard.KEY_D))// strafe right { camera.strafeRight(movementSpeed * dt); } // W+SHIFT ускорение вперед if (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)) { camera.walkForward(movementSpeed * dt + 0.005f); } // прыжок if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) { camera.jump(0); }
while (Keyboard.next()) { if (Keyboard.getEventKeyState()) { if (Keyboard.getEventKey() == Keyboard.KEY_SPACE && !jumping) { jumping = true; yVelocity = -3; } } }
if (camera.position.y > 0) { jumping = false; yVelocity = 0; }
camera.position.y += yVelocity * TIME_STEP; yVelocity += GRAVITY * TIME_STEP;
GL11.glLoadIdentity(); camera.lookThrough();
// что произойдет, когда окно будет закрыто if (Display.isCloseRequested()) { gameRunning = false; Display.destroy(); System.exit(0); } // при нажатии ESC, окно будет закрыто if (Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)) { Display.destroy(); System.exit(0); } } }
private void elements() { el.setColorBlock(/* сторона X */20,/* сторона Y */25,/* сторона Z */20,/* * цвет * X * -красный */1, /* * цвет * Y * - * зеленый */ 1, /* цвет Z-синий */1, /* перемещение в сторону X */10, /* * не * перемещаем * в * сторону * Y */0, /* * перемещаем * в * сторону * Z */ 5, rotation, /* вращение в сторону X */1, /* вращение в сторону Y */ 1, /* вращение в сторону Z */1); }
private void render() { // очиска буффера GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT); // поменяйте glDisable на glEnable, чтобы включить освещение // все станет серым, в следующем уроке я буду показывать, как загрузить // текстуру. GL11.glDisable(GL11.GL_LIGHTING);
// вращение rotation += 0.005f;
// создание куба
GL11.glBegin(GL11.GL_QUADS); GL11.glTranslatef(-centerX, centerY, -centerZ); GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Bottom GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // One side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Moar sides GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Last side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Real last side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); GL11.glEnd(); }
public static void main(String[] args) { Main main = new Main(); initDisplay(false); initGL(); main.run(); } }
|
|
| |
iXNomad | Дата: Понедельник, 20.08.2012, 22:39 | Сообщение # 2 |
Рядовой
Группа: Пользователи
Сообщений: 7
Награды: 1
Репутация: 0
Статус: Offline
| У меня ошибка в строке Elements el = new Elements();
|
|
| |
wawe | Дата: Вторник, 21.08.2012, 16:44 | Сообщение # 3 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| я знаю=) не обращай внимание, удали эту строку и пиши в render() это GL11.glBegin(GL11.GL_QUADS); GL11.glTranslatef(-centerX, centerY, -centerZ); GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Bottom GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // One side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Moar sides GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Last side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); // Real last side GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-2, 2, -2); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-2, 2, -2); GL11.glEnd();
|
|
| |
wawe | Дата: Вторник, 21.08.2012, 16:46 | Сообщение # 4 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| это просто был мой класс Elements ты можешь создать свой, так просто легче. пару строк и имеешь целый виртуальный мир! легче же написать две строки чем то, что было написано выше
|
|
| |
iXNomad | Дата: Понедельник, 27.08.2012, 16:22 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 7
Награды: 1
Репутация: 0
Статус: Offline
| Что в Elements надо писать?
Сообщение отредактировал iXNomad - Понедельник, 27.08.2012, 16:27 |
|
| |
wawe | Дата: Понедельник, 27.08.2012, 19:10 | Сообщение # 6 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| я уже не помню, я удалил свой Elements. Помню, что там было написано public class Elements{ public void render(float x, float y, float z и т.д){ GL11.glBegin(GL11.GL_QUADS); GL11.glTexCoord2f(0, 0); GL11.glVertex3f(-x, y, -z); GL11.glTexCoord2f(1, 0); GL11.glVertex3f(-x, y, -z); GL11.glTexCoord2f(1, 1); GL11.glVertex3f(-x, y, -z); GL11.glTexCoord2f(0, 1); GL11.glVertex3f(-x, y, -z); и т.д. } }
|
|
| |
wawe | Дата: Понедельник, 27.08.2012, 19:12 | Сообщение # 7 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| просто удали те строки: Elements el=new Elements(); el.setColorBlock
|
|
| |
wawe | Дата: Понедельник, 27.08.2012, 19:13 | Сообщение # 8 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| у меня сейчас мало времени, потом может напишу урок по шейдерам
|
|
| |
iXNomad | Дата: Среда, 29.08.2012, 17:15 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 7
Награды: 1
Репутация: 0
Статус: Offline
| А как текст на экран вывести? Просто способ Graphics2D не прокатит...
|
|
| |
wawe | Дата: Четверг, 30.08.2012, 17:30 | Сообщение # 10 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| не знаю =) у меня текст постоянно в 3D залазит
|
|
| |
wawe | Дата: Четверг, 30.08.2012, 17:35 | Сообщение # 11 |
Просто человек...
Группа: Администраторы
Сообщений: 50
Награды: 3
Статус: Offline
| и вообще, я перешел на C++. Там конечно код писать неудобно... но игры делать очень хорошо! не надо качать библиотеки и пакеты разные, взял написал пару строк и уже есть 3D проект
|
|
| |
Cosmo | Дата: Суббота, 18.05.2013, 03:47 | Сообщение # 12 |
Рядовой
Группа: Пользователи
Сообщений: 1
Награды: 0
Репутация: 0
Статус: Offline
| хочу выразить автору огромную благодарность за код, но он выдает просто черный инициализированый GL экран 800 на 600 а сам код - 2 ошибки.:) -
1.
в строке 320
private void elements() { el.setColorBlock
еl подчеркнуто красным, предлагает создать класс
2. и в строке 360
GL11.glTranslatef(-centerX, centerY, -centerZ); - centerX, centerY, centerZ - cannot find symbol, что разумеется, - они вроде бы нигде не заданы, как их правильно задать?
upd
и еще варнинг на строках
236 float dx = 0.0f; 237 float dy = 2.0f; 238 float dt = 5.0f;
- value is never used
оказывается, это еще не все. в первый раз не заметил, - при создании куба у всех всех вертексов одни координаты. тоесть модель куба не выстроена.
строки инициализации опенгл 198 и 199 повторяют 185 186
код не рабочий. автор, похоже просто потролил новичков этим своим недокодом
а на с++ перешел, наверное, потому, что на яве нормально писать так и не научился. только вот на деле в с++ проекты парой строк тоже не пишутся
Сообщение отредактировал Cosmo - Понедельник, 20.05.2013, 02:43 |
|
| |
|