Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            jMonkeyEngine3: Привет мир, Обучающая Серия
                jMonkeyEngine 3 Урок (3) — Hello Assets

jMonkeyEngine 3 Урок (3) — Hello Assets

Опубликованно: 06.02.2016, 16:15
Последняя редакция, Andry: 13.10.2017 23:32

Предыдущий: Hello Node, Следующий: Hello Update Loop

В этом уроке мы научимся загружать 3D-модели и текст в графе сцены, используя jME Менеджер ресурсов(Asset Manager). Вы также узнаете, как определить правильные пути, и какие форматы файлов использовать.

beginner-assets-models

Не удается найти файлы для запуска этого образца? Чтобы получить ресурсы (3D модели) используемые в этом примере, добавьте встроенный jME3-testdata.jar в ваш проект. В проекте созданном в jMonkeyEngine SDK (рекомендуем), просто щелкните [ПК Мыши] на вашем проекте, выберите Свойства, перейдите в раздел Библиотеки, нажмите кнопку [Добавить библиотеку] и добавьте предварительно сконфигурированную “jme3-test-data” библиотеку.

Пример кода

package jme3test.helloworld;

import com.jme3.app.SimpleApplication;
import com.jme3.font.BitmapText;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Spatial;
import com.jme3.scene.shape.Box;

/** Образец 3 - как загрузить модель OBJ и OgreXML модель,
 * материал/текстуры, или текст.*/
public class HelloAssets extends SimpleApplication {

    public static void main(String[] args) {
        HelloAssets app = new HelloAssets();
        app.start();
    }

    @Override
    public void simpleInitApp() {

        Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.obj");
        Material mat_default = new Material( 
        assetManager, "Common/MatDefs/Misc/ShowNormals.j3md");
        teapot.setMaterial(mat_default);
        rootNode.attachChild(teapot);

        // Создать стену с простой текстурой из test_data
        Box box = new Box(2.5f,2.5f,1.0f);
        Spatial wall = new Geometry("Box", box );
        Material mat_brick = new Material( 
        assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat_brick.setTexture("ColorMap", 
        assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
        wall.setMaterial(mat_brick);
        wall.setLocalTranslation(2.0f,-2.5f,0.0f);
        rootNode.attachChild(wall);

        // Отображение строки текста шрифтом по умолчанию
        guiNode.detachAllChildren();
        guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
        BitmapText helloText = new BitmapText(guiFont, false);
        helloText.setSize(guiFont.getCharSet().getRenderedSize());
        helloText.setText("Hello World");
        helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
        guiNode.attachChild(helloText);

        // Загрузите модель из test_data (OgreXML + материал + текстура)
        Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
        ninja.scale(0.05f, 0.05f, 0.05f);
        ninja.rotate(0.0f, -3.0f, 0.0f);
        ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
        rootNode.attachChild(ninja);
        // Вы должны добавить освещение, чтобы сделать модель видимой
        DirectionalLight sun = new DirectionalLight();
        sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
        rootNode.addLight(sun);

    }
}

Соберите и запустите образец. Вы должны увидеть зеленого ниндзю с разноцветным чайником, стоящим на стене. Текст на экране должен быть следующий: «Hello World».


Asset Manager (Менеджер ресурсов (3D моделей))

Под игровыми ресурсами мы подразумеваем все мультимедийные файлы такие как: модели, материалы, текстуры, целые сцены, пользовательские шейдеры, музыка и звуковые файлы, пользовательские шрифты. JME3 поставляется с удобным объектом AssetManager, который поможет вам получить доступ к своим ресурсам. AssetManager можете загружать файлы из:

  • Текущий путь к классам (верхний уровень папки проекта),
  • Папка игровых ресурсов assets вашего проекта и
  • Необязательные, прописанные вами пути.

Ниже приведена рекомендуемая структура папок для хранения игровых ресурсов в папке проекта:

MyGame/assets/  
MyGame/assets/Interface/ 
MyGame/assets/MatDefs/  
MyGame/assets/Materials/  
MyGame/assets/Models/       <-- ваши .j3o модели здесь 
MyGame/assets/Scenes/
MyGame/assets/Shaders/ 
MyGame/assets/Sounds/       <-- ваши аудио файлы здесь 
MyGame/assets/Textures/     <-- ваши текстуры здесь 
MyGame/build.xml            <-- настройки Ant 
MyGame/src/...              <-- ваш Java код здесь 
MyGame/...

Это всего лишь рекомендуемая передовая практика, и то, что вы получаете по умолчанию при создании нового Java проекта в jMokeyEngine SDK. Вы можете создать свою папку ресурсов и назвать в ней подпапки, как вы захотите.


Загрузка текстур

Разместите ваши текстуры в подпапке assets/Textures/. Загрузите текстуру в Материал до того, как вы зададите Материал. Следующий пример кода относится к методу simpleInitApp() и загружает простую модель стены:

// Создать стену с простой текстурой из test_data
Box box = new Box(2.5f,2.5f,1.0f);
Spatial wall = new Geometry("Box", box );
Material mat_brick = new Material( 
assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat_brick.setTexture("ColorMap", 
assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg"));
wall.setMaterial(mat_brick);
wall.setLocalTranslation(2.0f,-2.5f,0.0f);
rootNode.attachChild(wall);

В этом случае вы создаете свой собственный Материал и применяете его к Геометрии. Вы основываете Материалы на описании материала по умолчанию (например “Unshaded.j3md”), как показано в этом примере.


Загрузка текста и шрифтов

Этот пример показывает текст «Hello World» в нижней части экрана, используя шрифт по умолчанию. Вы прикрепляете текст к узлу guiNode – это специальный узел для отображения плоских (ортогональных) элементов. С помощью него вы показываете счет в игре, здоровье игрока и.т.п. Следующий пример кода так же реализуется в методе simpleInitApp().

// Отображение строки текста шрифтом по умолчанию
guiNode.detachAllChildren();
guiFont = assetManager.loadFont("Interface/Fonts/Default.fnt");
BitmapText helloText = new BitmapText(guiFont, false);
helloText.setSize(guiFont.getCharSet().getRenderedSize());
helloText.setText("Hello World");
helloText.setLocalTranslation(300, helloText.getLineHeight(), 0);
guiNode.attachChild(helloText);
Избавится от существующего текста можно отсоединив всех потомков узла guiNode.

Загрузка моделей

Экспортируйте вашу 3D модель в OgreXML формате (.mesh.xml, .scene, .material, .skeleton.xml) и поместите ее в подпапку ресурсов assets/Models/. Следующий пример кода так же реализуется в методе simpleInitApp().

// Загрузите модель из test_data (OgreXML + материал + текстура)
Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
ninja.scale(0.05f, 0.05f, 0.05f);
ninja.rotate(0.0f, -3.0f, 0.0f);
ninja.setLocalTranslation(0.0f, -5.0f, -2.0f);
rootNode.attachChild(ninja);
// Вы должны добавить свет, чтобы сделать модель видимой
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-0.1f, -0.7f, -1.0f));
rootNode.addLight(sun);

Обратите внимание, что вам не нужно создавать Материал, если вы экспортировали модель с Материалом. Не забудьте добавить источник света, как показано, иначе Материал (и вся модель) не будут видны.


Загрузка ресурсов с использованием пользовательских путей

Что делать, если ваша игра зависит от использования ваших файлов, которые не включены в дистрибутив? Если файл не находится в папке по умолчанию (папка assets), вы можете зарегистрировать пользовательский Locator и загружать из любого пути.

Здесь приведен пример использования ZipLocator, который регистрирует файл town.zip на верхнем уровне папок вашего проекта:

assetManager.registerLocator("town.zip", ZipLocator.class);
Spatial scene = assetManager.loadModel("main.scene");
rootNode.attachChild(scene);

А вот пример HttpZipLocator, который может скачивать сжатые модели и загружать их:

assetManager.registerLocator(
"https://storage.googleapis.com/"
            + "google-code-archive-downloads/v2/code.google.com/"
            + "jmonkeyengine/wildhouse.zip", 
HttpZipLocator.class);
Spatial scene = assetManager.loadModel("main.scene");
rootNode.attachChild(scene);

JME3 предлагает ClasspathLocator, ZipLocator, FileLocator, HttpZipLocator, и UrlLocator (смотрите com.jme3.asset.plugins).


Создание моделей и сцен

Для создания 3D моделей и сцен нужен 3D редактор сетки. Если у вас нет инструментов, установите Blender и плагин OgreXML Exporter. Затем вы создаёте полностью текстурированные модели (например с помощью Blender) и экспортируете их в свой проект. Затем вы используйте SDK, для загрузки моделей, конвертирования и создания 3D сцен из них.

Например: Из Blender, вы экспортируете свои модель в формате Ogre XML с материалами следующим образом:

  1. JMonkeyEngine требует, чтобы файл материала назывался тем же именем, что и модель, поэтому до открытия диалогового окна экспорта сделайте так. Назовите файлы модели которая будет экспортироваться например с именем something.mesh.xml с именем something.material, плюс (необязательно) something.skeleton.xml и некоторые файлы JPG.
  2. Открыть меню Файл ▸ Экспортировать ▸ Ogre3D экспортер откроет диалоговое окно.
  3. В поле экспортируемой модели: Выберите поддиректорию assets/Models/ или ваш путь assets/Models/something/.
  4. Активируйте следующие параметры:
      Замена осей: xz-y
      Separate materials (Отдельные материалы)
      Only Deformable Bones(Только деформируемые Кости)
      Export Scene(Экспорт сцены)
      Export Selected Only(Экспортировать только выбранные)
      Export Meshes(Экспорт сетки)
      Export Meshes Overwrite(Экспортировать сетку с перезаписью)
      Armature Animation(Анимация арматуры)
      Обрезка Массы
      Export Materials(Экспорт материалов)
  1. Кликните Export Ogre.

Формат файла модели

JME3 может конвертировать и загрузить:

  • Ogre XML модели + материалы,
  • Ogre DotScenes,
  • Wavefront OBJ + MTL модели,
  • .Blend файлы.

Метод loadModel() загружает эти исходные форматы файлов когда вы запускаете свой код непосредственно из SDK. Однако, если вы соберете исполняемый файл используя сборку скриптов по умолчанию, тогда оригинальные файлы моделей (XML, OBJ, и др.) не будут включены. Это означает, что когда вы запустите исполняемый файл вне SDK и загрузите любую оригинальную модель напрямую, вы получите следующее сообщение об ошибке:

com.jme3.asset.DesktopAssetManager loadAsset
WARNING: Cannot locate resource: Models/Ninja/Ninja.mesh.xml
com.jme3.app.Application handleError
SEVERE: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
java.lang.NullPointerException

Вы видите, что загрузка файлов XML/OBJ/Blend приемлема только на этапе разработки в SDK. Например, каждый раз когда ваш 3D дизайнер обновляет файлы в директорию игровых ресурсов assets, вы можете быстро просмотреть последнюю версию в вашей среде разработки.

Но для QA(на качество) тестов и для финальной сборки, вы должны использовать исключительно файлы .j3o. J3o – это оптимизированный бинарный формат для jME3 приложений. Когда вы делаете сборку для QA(на качество) тестов, или будете готовы к выпуску, используйте SDK для конвертации всех .obj/.scene/.xml/.blend файлов в .j3o файлы, и обновите весь код для загрузки .j3o файлов. Сценарий сборки по умолчанию автоматически упаковывает .j3o файлы в исполняемые.

Откройте ваш JME3 проект в jMonkeyEngine SDK.

  1. Щелкните [ПК Мыши] файл .blend, .obj или .mesh.xml в окне Проекты, и выберите Convert to J3o Binary.
  2. Файл .j3o появится рядом с файлом .mesh.xml и будет иметь такое же имя.
  3. Обновить все loadModel() строки для загрузки нового файла. Например:
Spatial ninja = assetManager.loadModel("Models/Ninja/Ninja.j3o");
Если ваш исполняемый файл выдает предупреждение «Cannot locate resource(Не удается найти ресурс)», проверьте все пути загрузок и убедитесь, что вы от конвертировали все модели в .j3o файлы!

Загрузка моделей и сцен

Задача? Решение!
Загрузить модель с материалами Используйте метод loadModel() в asset manager, и прикрепите spatial к rootNode.

Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.mesh.xml");
rootNode.attachChild(elephant);
Spatial elephant = assetManager.loadModel("Models/Elephant/Elephant.j3o");
rootNode.attachChild(elephant);
Загрузить модель без материалов Если у вас есть модель без материалов, вы должны дать ей материал, чтобы сделать ее видимой.

Spatial teapot = assetManager.loadModel("Models/Teapot/Teapot.j3o");
Material mat = new Material(assetManager, "Common/MatDefs/Misc/ShowNormals.j3md"); // материал по умолчанию
teapot.setMaterial(mat);
rootNode.attachChild(teapot);
Загрузить сцену Вы загружаете сцену точно также, как загружаете модели:

Spatial scene = assetManager.loadModel("Scenes/town/main.scene");
rootNode.attachChild(scene);
Spatial scene = assetManager.loadModel("Scenes/town/main.j3o");
rootNode.attachChild(scene);

Упражнение – как загрузить ресурсы

  1. Загрузите town.zip пример сцены.
  2. (Необязательно): Разархивируйте city.zip, чтобы увидеть структуру содержащегося Ogre dotScene: Вы получите папку с названием town. Он содержит XML файлы и текстуры, а так же файл с названием main.scene. (Это просто информация для вас, вам не нужно ничего делать с этим.)
  3. Поместите файл town.zip в верхнем уровне папок вашего проекта JME3, например, так:
    jMonkeyProjects/MyGameProject/assets/
    jMonkeyProjects/MyGameProject/build.xml
    jMonkeyProjects/MyGameProject/src/
    jMonkeyProjects/MyGameProject/town.zip
    ...
    

    Используйте следующий метод, чтобы загрузить модели из zip файла:

  4. Убедитесь, что town.zip находится в папке проекта.
  5. Зарегистрируйте локатор ZipLocator в директории проекта: добавьте следующий код в simpleInitApp() {
    assetManager.registerLocator("town.zip", ZipLocator.class);
    Spatial gameLevel = assetManager.loadModel("main.scene");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);
    

    Теперь метод loadModel() ищет эту zip директорию непосредственно в файлах загрузки.
    (это означает, не нужно писать loadModel(town.zip/main.scene) или чего-то подобного!)

  6. Очистите, соберите и запустите проект.
    Вы должны увидеть Ниндзю + стену + чайник стоящих в городе.
Если вы зарегистрировали новый локатор, убедитесь, что у вас не получается никаких конфликтов имен файлов: Не называйте все сцены main.scene (главная.сцена), лучше дайте каждой сцене своё единственное уникальное имя.

Ранее в этом уроке вы загружали сцены и модели из каталога ресурсов assets. Это самый распространенный способ загрузки сцен и моделей. Вот стандартная процедура:

  1. Удалить код, который был добавлен в предыдущем упражнении.
  2. Переместите распакованную папку town/ в папку assets/Scenes/ вашего проекта.
  3. Добавьте следующий код в simpleInitApp() {
    Spatial gameLevel = assetManager.loadModel("Scenes/town/main.scene");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);
    

    Обратите внимание, что путь относится к каталогу assets /….

  4. Очистите, соберите и запустите проект.
    Вы снова должны увидеть Ниндзю + стену + чайник стоящих в городе.

Вот третий метод, который вы должны знать, по загрузке сцены/модели из файла .j3o:

  1. Удалить код из предыдущего упражнения.
  2. Если вы это еще не сделали, то откройте SDK и откройте проект, содержащий класс HelloAsset.
  3. В окне проектов перейдите в папку assets/Scenes/town.
  4. Щелкните [ПК Мыши] main.scene и сконвертируйте сцену в двоичном формате: jMonkeyPlatform сгенерирует файл main.j3o.
  5. Добавьте следующий код в simpleInitApp() {
    Spatial gameLevel = assetManager.loadModel("Scenes/town/main.j3o");
    gameLevel.setLocalTranslation(0, -5.2f, 0);
    gameLevel.setLocalScale(2);
    rootNode.attachChild(gameLevel);
    

    Снова отметим, что путь относится к каталогу assets/….

  6. Очистите, соберите и запустите проект.
    Вы снова должны увидеть Ниндзю + стену + чайник стоящих в городе.

Выводы

Теперь вы знаете, как заполнить граф сцены статическими фигурами и моделями, и как создавать сцены. Вы научились загружать игровые ресурсы(assets) с помощью assetManager и вы видели, что путь к файлам начинается относительно вашей папки проекта. Еще одной важной вещью является то, что вы научились конвертировать модели в формат .j3o для исполняемых JAR и.т.д.

Теперь давайте добавим некоторое действие на сцене и продолжим изучение с циклическими обновлениями!  


Смотрите так же


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

Добавить комментарий

Содержание

jMonkeyEngine.ru © 2017. Все права сохранены.