JREGC

Главная | Регистрация | Вход Приветствую Вас Инопланетяне | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: wawe  
Форум » PROGRAMMING CATEGORY » Уроки LWJGL » LWJGL 3D Basic
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(); angry
 
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
mobnotch А как текст на экран вывести? Просто способ 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
 
Форум » PROGRAMMING CATEGORY » Уроки LWJGL » LWJGL 3D Basic
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2024
Используются технологии uCoz