Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Документация для продвинутых пользователей
                Рабочий процесс создания Сцены

Рабочий процесс создания Сцены

Опубликованно: 16.05.2017, 14:13
Последняя редакция, Andry: 21.02.2018 13:33

Рабочий процесс создания сцены: Blender для Jme3 jMP с помощью Ogre. Автор урока ste3e

В этом уроке рассматривается создание базовой сцены в Blender 2.49b … пол, куб и пустой playerPosition; Экспортирование сцены в jMP (jMonkey Platform 3) осуществляется с помощью Ogre; Загружаем сцену в jMP и захватываем объекты в сцене так, чтобы расположить актера в playerPos и заставить их смотреть на куб. Код Java обертывает движок Jme3 в статическом случае, так что к функциям движка можно получить доступ с помощью классов без необходимости передачи ссылок на движок.

  1. Откройте Blender. Мы оставим куб и сделаем под ним пол. Создадим Плоскость радиуса 3(6 x 6) для пола, перейдите на вкладку Создать, в панели слева, окна 3D-вида и выберите Плоскость
  2. Вы можете задать размер Плоскости после её создания, нажав N, чтобы открыть дополнительную панель инструментов и там в пункте Преобразование(Transform) измените значения Размеры по X Y. Убедитесь, что вы находитесь в Режиме объекта, а не в Режиме правки, и что вы выбрали вашу плоскость.

    SW2

    Расположите плоскость под кубом. Используйте NumPad1, NumPad3 и NumPad7 для изменения вида. Выберите куб и сделайте его Масштаб 1, 1, 1.

  3. Дайте и плоскости, и кубу материал и текстуру. Эта ссылка ведет вас к уроку это объяснено: Рабочий процесс создания Анимации. Убедитесь, что изображения текстуры будут находятся в одной и той же папке, что и файлы сцены.
  4. Добавьте Пустышку, перейдя во вкладку Создать раздел Другое. Поместите Пустышку, так чтобы ваша сцена выглядела примерно как на картинке:
  5. SW3

  6. Откройте окно Структура проекта и задайте осмысленное значение названиям ваших объектов, потому что эти названия будут предоставлены вам в jMP.
  7. SW4

  8. Прежде чем экспортировать сцену, нам нужно её в какую то папку в вашем проекте разместить. Создайте такую папку в папке Scenes вашего проекта jMP.
  9. SW5

  10. Предполагается, что у вас уже установлен плагин Ogre-экспортер в Blender (см. эту ссылку, если вы этого не сделали), пришло время экспортировать сцену в jMP. В окне Структура проекта окна Blender выберите плоскость, куб и пустышку; Нажмите и удерживайте клавишу shift, одновременно выбирая каждую из них, пока все они не будут отображаться подсвеченными оранжевым кружочком.
  11. SW6

    Выберите Файл ▸ Экспортировать ▸ Ogre3D.

    SW7

    Появится следующий экран. Оставьте камеру не выбранной (не зеленый). Выберите Путь к папке, которую вы только что создали в каталоге Scenes для jMP, и дайте файлу имя. Keep Fix Up Axis To Y, чтобы преобразовать z в Blender, зависит от jMP.

    SW8

  12. Затем мы должны экспортировать сетки.
  13. SW9

    У вас должно быть четыре файла в jMP. Они все текстовые файлы, которые вы можете открыть с помощью блокнота.
    10

  14. Щелкните правой кнопкой мыши на basic.scene и преобразуйте эти файлы в JME-файл двоичного j3o.
  15. SW11

    Если вы посмотрите на экран Output в jMP, вы увидите ошибки, файлы материалов не найдены. Важная ошибка — первая … jMP ищет файл с именем basic.material, но экспортируемый Ogre файл материала называется Scene.material.

    SW12

    Щелкните правой кнопкой мыши по файлу материала и используйте функцию переименования. Не добавляйте суффикс .материала, иначе вы получите материал basic.material.material.

    SW13

    Удалите j3o-файл из каталога. Нажмите в окне «Output» и Ctrl + L, чтобы очистить экран … затем снова конвертируйте basic.scene в j3o.

    SW14

    Результат должен теперь … игнорировать последнее.

  16. Если он еще не открыт, выберите SceneExplorer из меню Window. Дважды щелкните созданный вами файл basic.j3o. Вы должны увидеть расширяемый список узлов в файле j3o. Мы будем использовать box-node, playerPos-node и floornode.
  17. Теперь о коде. В этом уроке используется четыре класса:
    1. Jimy содержит main. Он инициализирует Jme3 и обертывает функциональность, предоставляемую движком, в статический класс, доступ к которому возможен по всей программе так же, как доступ к System.out.println возможен во всех программах. Наконец, он вызывает Game.java.
    2. Game предназначен для того, чтобы стать центром вашей игры. В этом случае он создает экземпляры SceneLoader и ModelLoader.
    3. SceneLoader загружает сцену, которую мы только что экспортировали. Он также делает PlayerPos доступным для модели
    4. ModelLoader создает прямоугольник, который используется в HelloWorld, позиционирует его в координатах, заданных playerPos, и использует метод lookAt, чтобы смотреть на него в направлени куба, экспортированного из Blender.
  18. Jimy.java:
  19. package mygame;
    
    import com.jme3.app.SimpleApplication;
    import com.jme3.system.AppSettings;
    import com.jme3.font.BitmapText;
    
    /**
    * Быстрый старт в Jme3. Обернём его функциональностью статический класс для легкого доступа.
    * Начало игры. Название Jimy было выбрано потому что оно короткое.
    *
    * @author ste3e... Спасибо Normen за wrapping code
    */
    
    public class Jimy extends SimpleApplication{
    
        private static Jimy jme;//обеспечит доступ к функциям движка
        private Game game=new Game();//начало вашей игры
        private static BitmapText sysout;//Отладка на экрана игрока
    
      public static void main(String[] args) {
        Jimy app = new Jimy();
    
        //Удалить начальный экран и замените его на заданный размер
        app.setShowSettings(false);
        AppSettings settings=new AppSettings(true);
        settings.put("Width", 1024);
        settings.put("Height", 768);
        settings.put("Title", "My Game");
        settings.put("VSync", true);
        settings.put("Samples", 4);
        app.setSettings(settings);
        app.start();
      }
    
      @Override
      public void simpleInitApp() {
        jme=this;    //инициализируйте статический класс здесь, чтобы остановить предупреждения об утечках
        flyCam.setEnabled(false);   //Отключить настройку управления камерой по умолчанию SimpleApplication
    
        //очистим guiNode для использования функции отладки.
        guiNode.detachAllChildren();
        guiFont=assetManager.loadFont("Interface/Fonts/Default.fnt");
        sysout=new BitmapText(guiFont, false);
        sysout.setSize(guiFont.getCharSet().getRenderedSize());
        sysout.setLocalTranslation(300, sysout.getLineHeight(), 0);
        guiNode.attachChild(sysout);
        //вызовем ваш Game класс
        game.init();
      }
    
      @Override
      public void simpleUpdate(float tpf){}
        /**
        * используется для отладки
        * @param str вызывается из места в коде, где вы хотите проверить что-то
        */
      public void debug(String str){
        sysout.setText(str);
      }
    
      /**
      * дает доступ к Jme3. Синтаксис: Jimy.grab(), коротко и выразительно
      * насколько это возможно.
      * @return статический экземпляр этого класса
      */
      public static Jimy grab(){
        return jme;
      }
    }
  20. Game.java:
  21. package mygame;
    
    /**
    * Здесь начинается игра.
    *@author ste3e
    */
    public class Game {
    
        private SceneLoader sceneLoader=new SceneLoader();
        private ModelLoader modelLoader=new ModelLoader();
    
      public void init(){
        sceneLoader.init();
    
        //modelLoader передаёт ссылку sceneLoader которая даёт доступ к playerPos
        modelLoader.init(sceneLoader);
      }
    }
      SceneLoader.java:
    package mygame;
    
    import com.jme3.scene.Node;
    import com.jme3.scene.Spatial;
    import com.jme3.math.Vector3f;
    import com.jme3.light.DirectionalLight;
    
    /**
    * Loads the j3o file and digs into it to grab the meshes and empties therein.
    * Note there is no reference to the Jme3 handed it, yet the rootNode,
    * assetManager etc from Jme3 are used.
    * @author ste3e
    */
    public class SceneLoader {
    
        //It seems meshes must be Nodes, empties must be Spatials
        private Node placeholder, scene, floor, box;
        private Spatial playerPos;
    
      public void init(){
    
        /*
        * placeholder is attached to the rootNode supplied by the Jme3. It
        * is accessed via Jimy.getJme() which gets the static class
        * created in Jimy. getRootNode() is a method found in Application
        * which Jimy accesses by extending SimpleAppliaction. The placeholder
        * is translated down the y axis, and the following Nodes are attached to it.
        */
        placeholder=new Node("placeholder");
        placeholder.setLocalTranslation(new Vector3f(0.0f,-2.5f,0.0f));
        Jimy.grab().getRootNode().attachChild(placeholder);
    
        /*
        * j3o файл загружается в Node scene. We then dig into scene
        * to grab its children, the empty playerPos-node, and the two
        * meshes. Note the children have the same names as those found in
        * the Scene Explorer
        */
        scene=(Node)Jimy.grab().getAssetManager().loadModel("Scenes/aScene/basic.j3o");
        playerPos=scene.getChild("playerPos-node");
        floor=(Node)scene.getChild("floor-node");
        box=(Node)scene.getChild("box-node");
    
        //две сетки к placeholder
        placeholder.attachChild(floor);
        placeholder.attachChild(box);
    
        /*
        * получить положение playerPos и печатает его значение x на экране с помощью 
        * функции отладки, определенной в Jimy.
        */
        Vector3f player=playerPos.getLocalTranslation();
        String str="playerEmpty x, y, z is ";
        str+= Float.toString(player.x) + ", ";
        str+=Float.toString(player.y) + ", ";
        str+=Float.toString(player.z);
        Jimy.grab().debug(str);
    
        //освещение
        DirectionalLight sun=new DirectionalLight();
        sun.setDirection(new Vector3f(-0.1f,-0.7f,-1.0f));
        Jimy.grab().getRootNode().addLight(sun);
      }
    
      //методы геттеры
      public Vector3f getPlayerPos(){
        return playerPos.getLocalTranslation();
      }
    
      public Vector3f getBoxPos(){
        return box.getLocalTranslation();
      }
    }
  22. ModelLoader.java:
  23. package mygame;
    
    import com.jme3.math.Vector3f;
    import com.jme3.scene.Geometry;
    import com.jme3.scene.shape.Box;
    import com.jme3.math.ColorRGBA;
    import com.jme3.material.Material;
    
    /**
    * Этот класс создает цветной куб и размещает его в координатах, заданных 
    * пустым playPos, и получает их для lookAt куб экспортированного  в фале scene.
    * @author ste3e
    *
    */
    public class ModelLoader{
      public void init(SceneLoader sceneLoader) {
    
        //См. Руководство Hello World для объяснения
        Box box=new Box(new Vector3f(0.0f,0.0f,0.0f), 0.5f,0.5f,0.5f);
        Geometry aBox=new Geometry("aBox", box);
        Material mat=new Material(Jimy.grab().getAssetManager(),
        "Common/MatDefs/Misc/SolidColor.j3md");
        mat.setColor("m_Color", ColorRGBA.randomColor());
        aBox.setMaterial(mat);
        aBox.setLocalTranslation(sceneLoader.getPlayerPos());
        aBox.lookAt(sceneLoader.getBoxPos(), new Vector3f(0.0f,1.0f,0.0f));
        Jimy.grab().getRootNode().attachChild(aBox);
      }
    }

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

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

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