admin / 18.06.2018

Уроки LWJGL — Форум

Blaume
Постараюсь ответить на ваши вопросы.

> Но для меня осталось неясным, почему Вы столь категорично отвергаете библиотеки scenegraph, в принципе.
ИМХО, все зависит от задач. Дело в том, что высокоуровневые библиотеки не позволят провести оптимизацию рендера под конкретную "тяжелую" задачу (игровая графика). С другой стороны, в низкоуровневом апи придется все писать практически с нуля.

> Но автор темы вообще привёл в пример другие библиотеки в первом сообщении. Например, JME или Xith3D (о которой упомянули в той самой статье на Vingrad.ru).
Ogre4j — java-обертка для движка Ogre3d
Irrlicht — так же есть java-обертка
jME — движок кажется мощным, однако имеет серьезные ошибки в архитектуре, несовсем последователен, медленный

Xith3d — скорее всего, это уже вполне готовый графический движок, однако, я его не использовал, поэтому ничего конкретного о нем сказать не могу

> JOGL — это прекрасно (абсолютно без иронии). Но почему-то зарубежные разработчики рекомендуют его аналог (о котором в той статье также упоминается, но с не самой лучшей стороны).
По возможностям JOGL и LWJGL одинаковы — это обертки над OpenGL 2.0. Разница только в дизайне этой обертки.

1) Какое средство Вы рекомендуете для создания апплетов и почему? (JOGL или Java3D)
Все зависит от задачи, кроме того, Java3D весит значительно больше.

2) У какого из средств наибольшая функциональность? (я склоняюсь к JOGL, но в статье как раз написано, что Java3D — это мощнейшая мультимедийная библиотека)
Java3D — по сути движок с мультирендером (GL и DX), JOGL — это обычный OpenGL. Java3D по возможностям не может обойти низкоуровневый API, но реализует большинство так или иначе необходимого для 3D-приложения функционала. Но JOGL как низкоуровневый API значительно гибче.

3) Является ли возможность рендеринга как в OpenGL, так и в DirectX у Java 3D серьёзным плюсом в разработке, если речь идёт об апплете, который должно просмотреть максимальное количество пользователей?
Java3D имхо использует только базовый функционал этих API, поэтому особой разницы быть не должно.

4) Действительно ли для JOGL подходит любая документация по OpenGL или всё несколько сложнее?
JOGL архитектурно состоит из модуля, управляющего графическим контекстом (javax.media.opengl.GLCanvas и прочие "аппаратные" классы), интерфейса javax.media.opengl.GL, через который происходит вызов функций OpenGL и его расширений, утилитной части com.sun.opengl.util (предоставляет готовые реализации для текстур, отрисовки текста, GLUT-примитивов, управления пайплайном (аниматоры). Собственно OpenGL-проекция в виде интерфейса GL настолько приближена к оригинальному API, что можно пользоваться любыми источниками информации, включая исходники на с/с++, статьи, книги и даже официальную документацию по OpenGL. Все остальные вспомогательные классы документированы и практически не влияют на собственно рендеринг.

LWJGL 3 Руководство

Опубликованно: 15.09.2017, 21:53

Последняя редакция, Andry: 08.05.2018 18:31

Это перевод вот этой статьи оригинал.

Это руководство поможет вам начать работу с LWJGL.

С чего начать

Пожалуйста, используйте конфигуратор сборки на нашей странице загрузки, чтобы настроить и загрузить версию LWJGL. Вам также понадобится Java SE Development Kit (JDK), для LWJGL требуется версия 8 или выше. Затем перейдите к настройке проекта в вашей любимой среде IDE и настройте его, как описано в Руководстве по установке.

Теперь вы должны быть готовы разработать и запустить приложение LWJGL. Ниже приведен простой пример, который использует GLFW для создания окна и очищает цвета фона до красного, используя OpenGL.

import org.lwjgl.*; import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; import org.lwjgl.system.*; import java.nio.*; import static org.lwjgl.glfw.Callbacks.*; import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryStack.*; import static org.lwjgl.system.MemoryUtil.*; public class HelloWorld { // обработка окна private long window; public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); init(); loop(); // Открыть окно обратным вызовом и уничтожить окно glfwFreeCallbacks(window); glfwDestroyWindow(window); // Завершить GLFW и освободить ошибки обратного вызова glfwTerminate(); glfwSetErrorCallback(null).free(); } private void init() { // Настройка ошибок обратного вызова. Реализация по умолчанию // сообщение об ошибке в System.err. GLFWErrorCallback.createPrint(System.err).set(); // Инициализировать GLFW.

Пишем движок игры под Android — tutorial часть 1 (примитивы)

Большинство функций GLFW не будут работать, до того как это будет сделано. if ( !glfwInit() ) throw new IllegalStateException("Unable to initialize GLFW"); // Конфигурируем GLFW glfwDefaultWindowHints(); // необязательно, текущие подсказки окна уже по умолчанию glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // окно останется скрытым после создания glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // размеру окна будет изменяемым // Создать окно window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL); if ( window == NULL ) throw new RuntimeException("Failed to create the GLFW window"); // Настроить клавишу обратного вызова. Он будет вызываться каждый раз, когда нажимается, повторно или отпускается клавиша. glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) glfwSetWindowShouldClose(window, true); // Мы обнаружим это в цикле рендеринга }); // Получить стек потока и нажать новый кадр try ( MemoryStack stack = stackPush() ) { IntBuffer pWidth = stack.mallocInt(1); // int* IntBuffer pHeight = stack.mallocInt(1); // int* // Получить размер окна, переданного glfwCreateWindow glfwGetWindowSize(window, pWidth, pHeight); // Получить разрешение основного монитора GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); // Центрировать окно glfwSetWindowPos( window, (vidmode.width() — pWidth.get(0)) / 2, (vidmode.height() — pHeight.get(0)) / 2 ); } // кадр стека автоматически открывается // Сделать контекст OpenGL текущим glfwMakeContextCurrent(window); // Включить v-sync glfwSwapInterval(1); // Сделать окно видимым glfwShowWindow(window); } private void loop() { // Эта строка имеет решающее значение для взаимодействия LWJGL с // контекстом OpenGL GLFW или с любым контекстом, который управляется извне. // LWJGL обнаруживает текущий контекст, в текущем потоке, // создает экземпляр GLCapabilities и делает привязки OpenGL // доступными для использования. GL.createCapabilities(); // Установите прозрачный цвет glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // Запустите цикл рендеринга, до тех пор пока пользователь не попытается закрыть // окно или нажал клавишу ESCAPE. while ( !glfwWindowShouldClose(window) ) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // очистить framebuffer glfwSwapBuffers(window); // поменять цвет буферов // Опрос событий окна. Клавиша обратного вызова выше, будет вызываться // только во время этого вызова. glfwPollEvents(); } } public static void main(String[] args) { new HelloWorld().run(); } }

LWJGL поставляется с богатой документацией, вы можете просматривать javadoc онлайн, начав отсюда. Для большего количества информации, FAQ, смотрите руководство и уроки посещая вики. Страницы Memory FAQ, Bindings FAQ и Устранение неполадок особенно полезны. Дополнительные примеры кода см. в LWJGL примеры и репозитории lwjgl3-demos (требуется ночная сборка). Для переноса существующего кода LWJGL 2 на LWJGL 3 смотрите руководство по миграции.

Сборка из исходников

Клонируйте Git репозиторий к себе, установить JDK и Apache Ant, затем вы должны быть готовы собрать. Используйте следующие цели:

    ant – Собирать все и выполнить тесты
    ant compile-templates – Компилировать шаблон генератора привязки(binding)
    ant compile – Компилировать Java код (включая генерируемый)
    ant compile-native – Компилировать и связывать родную библиотеку
    ant tests – Запустить набор тестов
    ant demo -Dclass=‹demo class› – Запустить одну из демок LWJGL в тестовом модуле
    ant clean – Удаляет все файлы и папки сгенерированные скриптом сборки.
    and -f update_dependencies.xml – Принудительно снова загружать все зависимости.

Обратите внимание, что цель родная архитектура определяется os.arch из JVM, которая запускает Ant. Для кросс-компиляции используйте переменную среды LWJGL_BUILD_ARCH для ее переопределения (задавайте x86 или x64).

Бинарные зависимости загружаются из стабильной ветки(branch) загрузки. Используйте переменную среды LWJGL_BUILD_TYPE, чтобы переопределить это:

nightly – последняя успешная сборка, возможно нерабочая. Репозитории зависимостей можно найти здесь
stable – по умолчанию, последняя сборка, которая была проверена на работоспособность с LWJGL,
release/latest – последняя стабильная сборка, которая была повышена до официального LWJGL $
release/{build.version} – ранее выпущенная сборка

Если вы используете пользовательские бинарники или просто работаете в offline режиме, задайте для переменной среды LWJGL_BUILD_OFFLINE одно из значений true/on/yes.

Процесс сборки LWJGL создает тысячи крошечных файлов. Если вы хотите перенаправить вывод в другую папку или устройство хранения, вы можете сделать это задав переменную среды LWJGL_BUILD_OUTPUT.

LWJGL для меня?

LWJGL простой, но мощный. Он не для всех.

Если вы пользовались OpenGL, вы будете чувствовать себя как дома.

Если вы только начинаете, то сначала ознакомьтесь с каждым API.

GLFW

GLFW — это библиотека с открытым исходным кодом, межплатформенная библиотека для создания окон с контекстами OpenGL и имеющая ввод и события. Его легко интегрировать в существующие приложения и нет необходимости размещать в основном цикле.

GLFW является предпочтительной системой окон для приложений LWJGL 3. Если вы знакомы с LWJGL 2, GLFW является заменой класса Display и всего в пакете ввода.

Изучить GLFW легко. Он имеет простой, но мощный API и полную документацию.

OpenGL

OpenGL — это лучшая среда для разработки портативных интерактивных 2D и 3D-графических приложений.

OpenGL — это массивный API с длинной историей и сотнями расширений. Изучение этого с нуля — это нелегкое занятие, но вы можете начать с его документации. OpenGL регистр также весьма полезен.

OpenCL

OpenCL — это первый открытый, беспроигрышный стандарт для кросс-платформенного параллельного программирования современных процессоров, которые находится на персональных компьютерах, серверах и карманных/встроенных устройствах. OpenCL (Открытый Язык Вычислений) значительно повышает скорость и отзывчивость для широкого спектра приложений во многих рыночных категориях: от игр и развлечений до научных и медицинских программ.

Спецификации OpenCL и его расширения можно найти в реестре Khronos OpenCL.

OpenAL

OpenAL (для «Открытых Аудио Библиотек») — это программный интерфейс для аудиооборудования. Интерфейс состоит из ряда функций, которые позволяют программисту указывать объекты и операции при производстве высококачественного аудио вывода, в частности многоканальный вывода от источников в 3D пространстве звука окружающего слушателя.

LWJGL поставляется вместе с OpenAL Soft, лицензированный по лицензии LGPL, кросс-платформенной программной реализацией аудио API-интерфейса OpenAL 3D.


Переведено для jmonkeyengine.ru, оригинал.
Автор перевода: Andry

Я ищу сценарий для Java, который позволит пользователям писать простые скрипты для управления поведением и событиями для игры. Что-то, что:

  • просто — что-то легко подбирать, особенно для людей с некоторым базовым опытом программирования / сценариев

  • предоставляет множество элементов управления — я могу легко запускать / останавливать / приостанавливать скрипты и контролировать, сколько времени будет выполняться каждый раз, возможно, сколько места в памяти они могут использовать

  • отделяется от самой среды Java — нет доступа от скриптов к любым объектам или классам Java, только к тем функциям, которые я явно предоставляю

Я рассмотрел JavaScript-движок Rhino, и он подойдет моим целям, но из того, что я прочитал (), он предназначен для интеграции с Java настолько, что безопасная песочница будет сложной.

Что такое хороший и бесплатный игровой движок?

Я бы предпочел начать с движка, который по умолчанию не дает скриптам никакого доступа к чему-либо, чем к полностью открытому, который я должен закрыть. Скриптам не всегда можно доверять, поэтому создать среду не так просто.

Я бы также подумал о разработке моего собственного языка с чем-то вроде ANTLR, но это, вероятно, больше усилий, чем я хочу добавить.

Любые предложения?

Возможности Java 2D

В системе пакетов и классов Java 2D, основа, которой— класс Graphics2D пакета java.awt, имеется несколько принципиально новых положений.

— Кроме координатной системы, принятой в классе Graphics и названной координатным пространством пользователя (User Space), введена еще система координат устройства вывода (Device Space): экрана монитора, принтера. Методы класса Graphics2D автоматически переводят (transform) систему координат пользователя в систему координат устройства при выводе графики.

— Преобразование координат пользователя в координаты устройства можно задать "вручную", причем преобразованием способно служить любое аффинное преобразование плоскости, в частности, поворот на любой угол и/или сжатие/растяжение.

Оно определяется как объект класса AffineTransform. Его можно установить как преобразование по умолчанию методом setTransform(). Возможно выполнять преобразование "на лету" методами transform и translate и делать композицию преобразований методом concatenate().

— Поскольку аффинное преобразование вещественно, координаты задаются вещественными, а не целыми числами.

— Графические примитивы: прямоугольник, овал, дуга и др., реализуют теперь новый интерфейс shape пакета java.awt. Для их вычерчивания можно использовать новый единый для всех фигур метод draw, аргументом которого способен служить любой объект, реализовавший интерфейс shape. Введен метод fill, заполняющий фигуры— объекты класса, реализовавшего интерфейс shape.

— Для вычерчивания (stroke) линий введено понятие пера (реп). Свойства пера описывает интерфейс stroke. Класс Basicstroke реализует этот интерфейс. Перо обладает четырьмя характеристиками:

— оно имеет толщину (width) в один (по умолчанию) или несколько пикселей;

— оно может закончить линию (end cap) закруглением — статическая константа CAP_ROUND, прямым обрезом — CAP_SQUARE (по умолчанию), или не фиксировать определенный способ окончания — CAP_BUTT;

— оно может сопрягать линии (line joins) закруглением — статическая константа JOIN_ROOND, отрезком прямой — JOIN_BEVEL, или просто состыковывать — JOIN_MITER (по умолчанию);

— оно может чертить линию различными пунктирами (dash) и штрих-пунктирами, длины штрихов и промежутков задаются в массиве, элементы массива с четными индексами задают длину штриха, с нечетными индексами — длину промежутка между штрихами.

— Методы заполнения фигур описаны в интерфейсе Paint. Три класса реализуют этот интерфейс. Класс color реализует его сплошной (solid) заливкой, класс GradientPaint — градиентным (gradient) заполнением, при котором цвет плавно меняется от одной заданной точки к другой заданной точке, класс Texturepaint — заполнением по предварительно заданному образцу (pattern fill).

— Буквы текста понимаются как фигуры, т. е. объекты, реализующие интерфейс shape, и могут вычерчиваться методом draw с использованием всех возможностей этого метода.

При их вычерчивании применяется перо, все методы заполнения и преобразования.

— Кроме имени, стиля и размера, шрифт получил много дополнительных атрибутов, например, преобразование координат, подчеркивание или перечеркивание текста, вывод текста справа налево. Цвет текста и его фона являются теперь атрибутами самого текста, а не графического контекста. Можно задать разную ширину символов шрифта, надстрочные и подстрочные индексы. Атрибуты устанавливаются константами класса TextAttribute.

— Процесс визуализации (rendering) регулируется правилами (hints), определенными Константами класса RenderingHints.

С такими возможностями Java 2D стала полноценной системой рисования, вывода текста и изображений.

2.2. Разработки Java 3D

Мы живем в трехмерном мире. Наше зрение позволяет нам видеть в трех измерениях с координатами x, y и z. Многие из поверхностей, на которых отображается графика, — например, экраны мониторов или листы бумаги — являются плоскими. Программирование трехмерной графики позволяет нам воспроизводить реалистичные модели нашего объемного мира на поверхностях в двухмерном виде. Трехмерная графика имеет преимущества в том смысле, что практически все, что вы можете видеть вокруг, можно моделировать — цифровым образом представить форму и размеры, а также отобразить — нарисовать на экране компьютера.

В настоящее время существует большое число приложений, позволяющих работать с трехмерной графикой — от игр и медицинского оборудования до трехмерных игр и хранителей экранов. Достижения в области компьютерного аппаратного обеспечения привели к значительному росту интереса к трехмерной графике. Успех в создании высокопроизводительного аппаратного обеспечения способствовали разработкам высокоэффективных интерфейсов прикладного программирования трехмерной графики — от созданного в 70-х годах APICORE от Siggraph и создания в 80-х годах прошлого века OpenGL компанией SGI, до сегодняшних средств программирования трехмерной графики, включая MicrosoftDirectSD и Java3D.

Трехмерная графика требует графических алгоритмов, использующих сложный математический аппарат. Java 3D предоставляет разработчикам надежные и развитые возможности для работы с трехмерной графикой, в то же время оставляя за сценой математику, необходимую для реализации графических алгоритмов. Java 3D — это высокоуровневый API программирования трехмерной графики. Java 3D управляет всеми необходимыми низкоуровневыми операциями для работы с графикой, поэтому разработчики могут создавать сложные трехмерные сцены, не задумываясь об используемом аппаратном обеспечении. Подобно Java, код Java 3D, будучи написанным, однажды, работает повсеместно. Приложения Java 3D будут работать аналогичным образом на различных графических платформах.

SunMicrosystems разрабатывала Java 3D API, имея в виду четыре основные цели: переносимость приложений, независимость от аппаратного обеспечения, масштабирование производительности и способность работать с трехмерной графикой через сеть.

Пишем собственный игровой движок с помощью C++

Упрощение сложных графических операций играло ключевую роль при разработке Java 3D API. Вот некоторые области и сферы применения APIJava 3D:

•визуализация трехмерных данных,

•взаимодействующие между собой приложения,

•игры (особенно сетевые с несколькими участниками),

•деловая графика,

•интерактивные обучающие системы,

•моделирование и визуализация молекулярных структур,

•разработка трехмерных Web-приложений,

•разработка трехмерных графических пользовательских интерфейсов.

Java 3D предлагает несколько функциональных возможностей, которые могут использоваться для разработки трехмерных графических приложений:

Поведения. Java 3D поддерживает множество поведений, включая анимацию и перемещение, обнаружение столкновений (выявление, когда два объекта сталкиваются) и морфинг (трансформацию одного изображения в другое изображение).

Вуалирование. Java 3D поддерживает вуалирование содержимого, что ограничивает возможность просмотра определенных объектов в сцене. Например, вуалирование помогает создать реалистичную модель ливня или урагана в игре.

Геометрия. Java 3D имеет встроенные трехмерные графические примитивы для создания геометрических фигур. В Java 3D можно отображать сцены, созданные в других приложениях трехмерной графики, например, SDStudioМах, VRML и LightwaveSD.

Освещение. Java 3D позволяет освещать объекты трехмерной сцены. Java 3D поддерживает различные виды освещения и управления его цветом, направлением и интенсивностью.

Звук. Уникальной особенностью Java 3D является поддержка SD-звука.

Текстуры. Java 3D поддерживает наложение текстур на поверхности трехмерных фигур.

Сцены Java 3D.

Изображения, отображаемые с помощью Java 3D, называют сценами. Сцену также называют виртуальной вселенной – это трехмерное пространство, которое содержит набор фигур. Корнем сцены Java 3D является объект VirtualUniverse. Объект VirtualUniverse имеет систему координат для местоположения графов сцены, которые она содержит. Каждая трехмерная сцена Java 3D описывается рядом графов сцены – иерархических структур, которые задают атрибуты трехмерной среды. Каждый граф сцены прикреплен к объекту VirtualUniverse в определенной точке системы координат виртуальной системы. Граф сцены состоит из внутренней системы координат и графов – ветвей. Каждый граф сцены имеет внутреннюю систему координат. Класс Localeявляется корневым узлом графа сцены и содержит вложенные системы координат для виртуальной вселенной и ряд графов-ветвей. В Java 3D имеется два типа графов-ветвей: графы-ветви содержимого и графы-ветви представления. Графы-ветви содержимого задают содержимое в трехмерных сценах, включая геометрию, освещение, текстуры, вуалирование и поведение. Графы-ветви представления содержат платформы наблюдения — коллекции объектов, которые определяют перспективу, позицию, ориентацию и масштаб в трехмерных сценах. Платформу наблюдения также называют точкой зрения.

Класс SceneGraphObject Java 3D — базовый класс для всех объектов в графе-ветви. Объект SceneGraphObject может содержать группу Group, которая представляет собой узел, содержащий множество дочерних узлов. Дочерними узлами группы Group могут быть группы (объект Group), листья (объект Leaf) или узлы-компоненты (объект NodeComponents). Узлы-листья Leaf задают геометрию, освещение и звук в графах-ветвях содержимого и компоненты платформы наблюдения в графе-ветви представления. Объекты NodeComponent задают различные компоненты в объектах Group и Leaf, такие как текстура и атрибуты цвета.


ДОБАВИТЬ КОММЕНТАРИЙ  [можно без регистрации]
перед публикацией все комментарии рассматриваются модератором сайта — спам опубликован не будет

Хотите опубликовать свою статью или создать цикл из статей и лекций?
Это очень просто – нужна только регистрация на сайте.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*