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

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

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

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

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

  1. Откройте Blender. Мы оставим куб и сделаем пол под ним. Создадим (Plane)плоскость 6 x 6 для пола, нажмите пробел, чтобы открыть соответствующее меню.
  2. SW1

    Вы можете установить размер Плоскости(plane) после ее создания, нажав N, чтобы открыть Преобразование(Transform Properties) и изменить значения Размеры по X Y (Dimx и Dimy). Убедитесь, что вы находитесь в режиме объекта, а не в режиме редактирования, и что вы выбрали плоскость.

    SW2

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

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

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

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

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

    Выберите опцию «Экспортировать» в меню «Файл» и выберите «Ogre Scene».

    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;
    
    /**
    * Kickstart the Jme3. Wrap its functionality in a static class for easy access.
    * Start the game. The name Jimy was chosen because it is short.
    *
    * @author ste3e... Thanks to Normen for the 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
    
        //clear guiNode for the debug function's use.
        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);
        //call to your Game class
        game.init();
      }
    
      @Override
      public void simpleUpdate(float tpf){}
        /**
        * used for debuging
        * @param str is called from place in code where you want to check something
        */
      public void debug(String str){
        sysout.setText(str);
      }
    
      /**
      * gives acces to the Jme3. Syntax is: Jimy.grab(), as short as meanigfully
      * possible.
      * @return static instance of this class
      */
      public static Jimy grab(){
        return jme;
      }
    }
  20. Game.java:
  21. package mygame;
    
    /**
    * This is where the game begins.
    *@author ste3e
    */
    public class Game {
    
        private SceneLoader sceneLoader=new SceneLoader();
        private ModelLoader modelLoader=new ModelLoader();
    
      public void init(){
        sceneLoader.init();
    
        //hand modelLoader a reference to sceneLoader so playerPos can be accessed
        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);
    
        /*
        * the j3o file is loaded into the 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);
    
        /*
        * get the position of playerPos and print it's x value to the screen using the
        * debug function defined in 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;
    
    /**
    * This class creates a colored box and positions it at the coordinates given
    * by the empty playPos, and gets it to lookAt the cube exported in the scene file.
    * @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. Все права сохранены.