Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Документация jMonkeyEngine
        jMonkeyEngine Уроки и Документация
            Внешние программы
                3ds Max Анимация Костей для JME3 с использованием плагина OgreMax

3ds Max Анимация Костей для JME3 с использованием плагина OgreMax

Опубликованно: 27.10.2017, 20:40
Последняя редакция, Andry: 27.10.2017 20:40

Asset Management

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

Создание моделей в 3dsMax

Для этого урока я использовал 3D Studio Max 2012 и бесплатную версию OgreMax 2.4.3

Создать модель и кости

  • Создать новый файл
  • Выберите вкладку «Создать»> «Геометрия»> «Цилиндр»
  • 3dsmax-0

  • Нарисуйте цилиндр, скажем, с 8 сегментами высоты (должно быть достаточно для гладкой деформации)
  • Также проверьте «Создание картографических кодов».
  • 3dsmax-1

  • Нажмите вкладку «Создать»> «Системы»> «Кости»
  • 3dsmax-2

  • Добавить кости в центре цилиндра
  • 3dsmax-3

  • Выберите цилиндр, щелкните его правой кнопкой мыши и нажмите «Преобразовать в:»> «Преобразовать в редактируемую сетку», чтобы предотвратить проблемы с OgreMax
  • Перейдите на вкладку «Изменить»> «Список модификаторов» и добавьте модификатор «Кожа»
  • 3dsmax-4

  • Под «Bones:» нажмите «Добавить» и выберите все ваши кости
  • 3dsmax-5

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

Создание анимации

  • Выберите цилиндр и нажмите вкладку «Отобразить»> «Зафиксировать выбранный», чтобы было легче выбрать кости во время анимации
  • Выберите две верхние кости и включите режим «Авто-ключ»
  • 3dsmax-6

  • Первый ключевой кадр будет создан автоматически. Переместите ползунок анимационной дорожки на кадр 5
  • Немного переместите выделенные кости. Сетка цилиндра будет деформирована. Поскольку вы находитесь в режиме «Авто-ключ», будет создан ключевой кадр
  • 3dsmax-7

  • Создайте несколько дополнительных ключевых кадров. Вы также можете выбрать больше костей и переместить или повернуть их. Я создал 25 кадров, и последний ключевой кадр равен первому, так что анимация является петлевой
  • После создания анимации отключите режим «Авто-ключ»

Настройки OgreMax

  • Откройте меню «Настройки сцены OgreMax» в меню
  • На вкладке «Меши» включите «Экспорт файлов XML» и отключите «Экспорт двоичных файлов», а также «Экспорт вершинных цветов»,
  • 3dsmax-8

  • Перейдите на вкладку «Окружающая среда» и снимите флажок «Экспортировать параметры среды». В противном случае импортер JME выдаст исключение NullPointerException
  • 3dsmax-9

  • Если вы текстурировали свою модель, вы также можете проверить «Скопировать растровые изображения в каталог экспорта» на вкладке «Растровые изображения»
  • Разблокируйте цилиндр, щелкнув вкладку «Дисплей»> «Освободить все» и выберите его
  • Выбрав выбранный цилиндр, откройте диалоговое окно «Настройки объекта OgreMax» в меню
  • Откройте вкладку «Mesh Animations» и выберите «Скелет», «Экспортный скелет»: «Да»,
  • Ниже «Mesh Animations» нажмите кнопку «Добавить …»
  • Назначьте имя треку, возможно, «качайте». Тип трека должен быть «Кожа. Установите правильную «Начальную / конечную рамки» для вашей анимации
  • 3dsmax-10

  • Нажмите ОК, и вы увидите анимацию в таблице. Вы можете добавить дополнительные анимации, выбрав другие диапазоны кадров, если хотите
  • 3dsmax-11

Экспорт и импорт

  • Когда все анимации находятся в списке, выберите «OgreMax»> «Экспорт»> «Экспортировать сцену» и назовите файл «worm.scene»,
  • Создайте тестовый класс JME, который импортирует файл, получает контроллер анимации и запускает анимацию «вобуляции»
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.Skeleton;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.FileLocator;
import com.jme3.light.AmbientLight;
import com.jme3.light.PointLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.LodControl;
import com.jme3.scene.debug.SkeletonDebugger;

/**
 * This is a test class for loading a Ogre XML scene exported by OgreMax.
 *
 * @author Stephan Dreyer
 *
 */
public class TestOgreMaxImport extends SimpleApplication {

  @Override
  public void simpleInitApp() {
    assetManager.registerLocator("Assets/model/ogre/test/", FileLocator.class);

    // create the geometry and attach it
    final Node model = (Node) assetManager.loadModel("worm.scene");
    // resize it, because of the large 3dsmax scales
    model.setLocalScale(.001f);

    // attach to root node
    rootNode.attachChild(model);
    addLodControl(model);

    final AnimControl ac = findAnimControl(model);

    try {
      // add a skeleton debugger to make bones visible
      final Skeleton skel = ac.getSkeleton();
      final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton",
          skel);
      final Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");
      mat.setColor("Color", ColorRGBA.Green);
      mat.getAdditionalRenderState().setDepthTest(false);
      skeletonDebug.setMaterial(mat);
      ((Node) ac.getSpatial()).attachChild(skeletonDebug);

      // create a channel and start the wobble animation
      final AnimChannel channel = ac.createChannel();
      channel.setAnim("wobble");
    } catch (final Exception e) {
      e.printStackTrace();
    }

    // add some lights
    rootNode.addLight(new AmbientLight());
    rootNode.addLight(new PointLight());
  }

  public void addLodControl(final Spatial parent) {
    if (parent instanceof Node) {
      for (final Spatial s : ((Node) parent).getChildren()) {
        addLodControl(s);
      }
    } else if (parent instanceof Geometry) {
      final LodControl lc = new LodControl();
      lc.setDistTolerance(1f);
      parent.addControl(lc);
    }
  }

  /**
   * Method to find the animation control, because it is not on the models root
   * node.
   *
   * @param parent
   *          The spatial to search.
   * @return The {@link AnimControl} or null if it does not exist.
   */
  public AnimControl findAnimControl(final Spatial parent) {
    final AnimControl animControl = parent.getControl(AnimControl.class);
    if (animControl != null) {
      return animControl;
    }

    if (parent instanceof Node) {
      for (final Spatial s : ((Node) parent).getChildren()) {
        final AnimControl animControl2 = findAnimControl(s);
        if (animControl2 != null) {
          return animControl2;
        }
      }
    }

    return null;
  }

  public static void main(final String[] args) {
    new TestOgreMaxImport().start();
  }
}

Вы увидите странные движения червей. Повеселись!

3dsmax-12

3ds Max Двножная Анимация для JME3

Вы также можете использовать двунаправленный оператор для анимации моделей, но вы должны учитывать множество вещей.

Создание персонажа в 3dsMax

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

  • Вы можете создать двуногий, прежде чем приступать к моделированию, поэтому довольно легко подогнать пропорции двуногих.
  • После создания модели и двуногого я получил что-то вроде этого:
  • 1

  • Я добавил модификатор Meshmooth с 2 итерациями и получил этот результат:
  • 3dsmax_biped_2

  • После сглаживания вашей сетки вы можете исправить вершины с помощью модификатора Edit Mesh. Наконец, вы добавляете модификатор Physique.
  • Теперь вы можете редактировать свои конверты в соответствии с вашей моделью.

Создание простой анимации ходьбы

  • Выберите сундук вашего бипеда, выберите вкладку «Движение (1)>« Шаг стопы »(2)>« Создать несколько шагов (3)
  • Вам нужно выбрать «В режиме места» (4), чтобы персонаж двигался на месте, не меняя своего местоположения.
  • 3dsmax_biped_3_1

  • Теперь вы можете немного поиграть с настройками, я скорректировал «Фактическая длина шага» и «Фактическая высота шага».
  • Для «Количество шагов 6 будет достаточно, потому что анимация будет циклически позже.
  • Примечание. Вы также можете создавать или редактировать шаги вручную и перемещать или поворачивать их.
  • После того, как все шаги будут созданы, нажмите кнопку «Создать клавиши для неактивных шагов» на панели «Панель шагов»
  • Теперь вы можете проверить свою анимацию, нажав кнопку «Play» на временной шкале.

Подготовка экспорта и настройка OgreMax

  • «Настройки сцены OgreMax должны быть такими же, как показано выше.
  • Поскольку вы хотите, чтобы ваша анимация была зациклена, вам нужно найти два ключевых кадра, где ноги находятся почти в одном положении. Для моих настроек я выбрал кадры 48-78 для анимации прогулок.
  • Выберите сетку символов и откройте диалоговое окно «Настройки сцены OgreMax».
  • Откройте вкладку «Mesh Animations» и выберите «Скелет», «Экспортный скелет»: «Да»,
  • Ниже «Mesh Animations» нажмите кнопку «Добавить …»
  • 3dsmax_biped_4

  • Введите имя трека, например. «ходить.
  • Убедитесь, что для типа дорожки задано значение «Physique.
  • Установите начальный и конечный фреймы, для меня это 48-78.
  • Закройте диалоговое окно, нажав «Ok.
  • Примечание. Было бы полезно создать также трек «start_run», который сочетается между анимацией стенда и ходьбы. Я бы использовал для этого фрейм 0-47.
  • Поскольку у вас есть гладкая модель с большим количеством полигонов, может быть полезно создать уровни детализации (LOD). Когда камера будет дальше, будет отображаться низкополитическая сетка вашего персонажа.
  • 3dsmax_biped_5

  • Откройте вкладку «Mesh LOD» в настройках объекта.
  • Достаточно выбрать «Автоматическая настройка», но если ваша анимация начнет выглядеть странно, вы можете создать ее вручную.
  • Я использовал 4 уровня LOD с расстоянием 1. Не беспокойтесь о настройке расстояния, вы можете изменить его позже в JME.
  • Для снижения уровня я использовал 20 процентов, которые дают хорошие результаты. Вы можете настроить все настройки в зависимости от ваших потребностей.
  • Закройте диалоговое окно, нажав «Ok.

Фиксирование местоположения

  • Перед экспортом вам нужно сделать небольшое исправление, потому что ваша модель на самом деле не находится там, где вы ее видите. JME попадет в массу неприятностей, если вы не измените это.
  • Обеспечьте сохранение максимального файла. Иногда OgreMax выдает всю заявку во время экспорта. Если вы хотите изменить анимацию после экспорта, вы должны перезагрузить этот файл, потому что исправление местоположения меняет то, что я действительно не могу понять.
  • 3dsmax_biped_6

  • Щелкните правой кнопкой мыши инструмент «Выбрать и переместить» на верхней панели инструментов. Появится диалоговое окно.
  • Установите X и Y в положение 0 и закройте диалог.
  • Есть еще один способ добиться этого. Если вы масштабировали, перемещали или поворачивали свою модель, просто откройте вкладку «Иерархия» и нажмите «Трансформировать» и «Масштаб» на панели «Сброс».

Экспорт и импорт

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

Для этого я расширил первый класс:

import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.Skeleton;
import com.jme3.app.SimpleApplication;
import com.jme3.asset.plugins.FileLocator;
import com.jme3.light.AmbientLight;
import com.jme3.light.PointLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import com.jme3.scene.control.LodControl;
import com.jme3.scene.debug.SkeletonDebugger;
import com.jme3.scene.shape.Box;

/**
 * This is a test class for loading a Ogre XML scene exported by OgreMax.
 *
 * @author Stephan Dreyer
 *
 */
public class TestOgreMaxImport extends SimpleApplication {

  @Override
  public void simpleInitApp() {
    assetManager.registerLocator("Assets/model/ogre/test/", FileLocator.class);

    // create the geometry and attach it
    final Node model = (Node) assetManager.loadModel("guy.scene");
    // resize it, because of the large 3dsmax scales
    model.setLocalScale(.02f);

    // attach to root node
    rootNode.attachChild(model);
    addLodControl(model);

    final AnimControl ac = findAnimControl(model);

    try {
      // add a skeleton debugger to make bones visible
      final Skeleton skel = ac.getSkeleton();
      final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton",
          skel);
      final Material mat = new Material(assetManager,
          "Common/MatDefs/Misc/Unshaded.j3md");
      mat.setColor("Color", ColorRGBA.Green);
      mat.getAdditionalRenderState().setDepthTest(false);
      skeletonDebug.setMaterial(mat);
      ((Node) ac.getSpatial()).attachChild(skeletonDebug);

      // create a channel and start the walk animation
      final AnimChannel channel = ac.createChannel();
      channel.setAnim("walk");
    } catch (final Exception e) {
      e.printStackTrace();
    }

    flyCam.setMoveSpeed(40f);
    cam.setLocation(new Vector3f(15, 10, 15));
    cam.lookAt(Vector3f.ZERO, Vector3f.UNIT_Y);
    cam.setFrustumNear(1f);

    // add some lights
    rootNode.addLight(new AmbientLight());

    final PointLight pl = new PointLight();
    pl.setPosition(new Vector3f(-3f, 3f, 1f));
    rootNode.addLight(pl);

    // add a box as floor
    final Box b = new Box(100f, 0.1f, 100f);
    final Geometry geo = new Geometry("floor", b);

    final Material mat = new Material(assetManager,
        "Common/MatDefs/Misc/Unshaded.j3md");
    mat.setColor("Color", ColorRGBA.LightGray);
    geo.setMaterial(mat);

    rootNode.attachChild(geo);
  }

  /**
   * Method to traverse through the scene graph and add a {@link LodControl} to
   * the mesh.
   *
   * @param parent
   *          The Node to add the control to.
   */
  public void addLodControl(final Spatial parent) {
    if (parent instanceof Node) {
      for (final Spatial s : ((Node) parent).getChildren()) {
        addLodControl(s);
      }
    } else if (parent instanceof Geometry) {
      final LodControl lc = new LodControl();

      // the distance for LOD changes is set here, you may adjust this
      lc.setDistTolerance(1f);
      parent.addControl(lc);
    }
  }

  /**
   * Method to find the animation control, because it is not on the models root
   * node.
   *
   * @param parent
   *          The spatial to search.
   * @return The {@link AnimControl} or null if it does not exist.
   */
  public AnimControl findAnimControl(final Spatial parent) {
    final AnimControl animControl = parent.getControl(AnimControl.class);
    if (animControl != null) {
      return animControl;
    }

    if (parent instanceof Node) {
      for (final Spatial s : ((Node) parent).getChildren()) {
        final AnimControl animControl2 = findAnimControl(s);
        if (animControl2 != null) {
          return animControl2;
        }
      }
    }

    return null;
  }

  public static void main(final String[] args) {
    new TestOgreMaxImport().start();
  }
}

После запуска класса вы можете увидеть приятную плавную анимацию (если она негладкая, вам нужно настроить кадры дорожки):

3dsmax_biped_7

Как вы можете видеть, LOD работает:

3dsmax_biped_8


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

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

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