Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Как рисовать 2D пользовательский интерфейс в игре поверх 3D?

#java #opengl #разработка_игр #gui #lwjgl


Я создал 3D игру наподобие Minecraft на языке Java при помощи библиотеки LWJGL. Так
же могу передвигаться по миру, смотреть вверх, вниз, оглядываться, и так далее. А как
отобразить панель, наподобие той, которую я выделил красным цветом на прикреплённом
рисунке? 



Допустим, эти квадратики я нарисовал в Paint'е и сохранил в файле panel.png, но как
её отобразить?

Напишите примерный исходный код.
    


Ответы

Ответ 1



В коде инициализации экрана (перед главным циклом) написать следующий код: GL11.glEnable(GL11.GL_TEXTURE_2D); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glMatrixMode(GL11.GL_PROJECTION); GL11.glLoadIdentity(); GL11.glOrtho(0, Display.getWidth(), Display.getHeight(), 0, 1, -1); GL11.glMatrixMode(GL11.GL_MODELVIEW); Texture i4 = TextureLoader.getTexture("PNG", new FileInputStream("textures" + File.separator + "myTexture.png")); А в главном цикле следующее: while (!Display.isCloseRequested()) { GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); i4.bind(); GL11.glBegin(GL11.GL_QUADS); // Координаты и разрешение текстуры GL11.glTexCoord2f(0F, 0F); GL11.glVertex2f(100F, 100F); GL11.glTexCoord2f(1F, 0F); GL11.glVertex2f(100F + (float) i4.getTextureWidth(), 100F); GL11.glTexCoord2f(1F, 1F); GL11.glVertex2f(100F + (float) i4.getTextureWidth(), 100F + (float) i4.getTextureHeight()); GL11.glTexCoord2f(0F, 1F); GL11.glVertex2f(100F, 100F + (float) i4.getTextureHeight()); GL11.glEnd(); }

Ответ 2



Создайте отдельный контейнер для спрайтов, закреплённый относительно камеры и разместите в нём спрайты пользовательского интерфейса. В качестве контейнера можно использовать поростой прямоугольник с текстурой (канвой). С текстурой (канвой) можно оперировать через PixelWriter и PixelReader, перерисовывая области на плоскости. Либо можно сделать аналог Group из JavaFX, так же закрепить его экземпляр относительно камеры и уже добавлять 3D элементы интерфейса. UPD: Посмотрите обсуждение здесь https://github.com/LWJGL/lwjgl3/issues/101 UPD2: Вот здесь вопрос уже обсуждался https://gamedev.stackexchange.com/questions/18468/making-a-hud-gui-with-opengl-lwjgl (Кратко: человек отрисовывает мир, а потом уже интерфейс поверх мира только и всего). UPD3: И ещё одна рекомендация здесь https://gamedev.stackexchange.com/a/29284 - использовать готовую библиотеку для GUI в LWJGL - Nifty (http://void256.github.io/blog/ -> https://github.com/nifty-gui/nifty-gui)

Ответ 3



В общем подход такой: Рисуем игру в объемной проекции (перспектива и т.п.) Переключаем проекцию на ортографическую Выключаем буфер глубины Рисуем интерфейс

Ответ 4



В андроиде есть FrameLayout для отображения одного контента поверх второго, думаю такая штука есть и в вашей отрасли

Комментариев нет:

Отправить комментарий