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

JME3 Кинематика

Опубликованно: 10.05.2017, 22:40
Последняя редакция, Andry: 11.05.2017 16:16

Кинематика JME3 (com.jme.cinematic) позволяет вам удалённо управлять узлами и камерами в 3D-игре: вы можете создавать сценарии и проигрывать кинематографические сцены. Вы можете использовать кинематику для создания роликов и фильмов/трейлеров для вашей игры. Другим хорошим примером использования является эффективная «физика разрушения: воспроизведение записанных заранее разлетающихся по сторонам обломкам при уничтожении чего то происходит гораздо быстрее, чем их расчет с помощью живой физики.

Внутренне, Cinematics реализованы как AppStates.

Краткий обзор кинематографического процесса:

  1. Запланируйте сценарий своего фильма.
    Запишите временную шкалу (например, на бумаге), субъект который должен быть в том месте, где в это время.
  2. Прикрепите объекты сцены, которые вы хотите дистанционно управлять, к одному узлу.
    Этот узел может быть корневым узлом или узлом, присоединенным к корневому узлу.
  3. Создайте Cinematic объект для этой сцены. Cinematic будет содержать и управлять сценарием фильма.
  4. Для каждой строки в вашем сценарии (для каждого ключевого кадра на вашей временной шкале) добавьте CinematicEvent в Cinematic.

Образец кода

Как использовать кинематографический

Cinematic похож на сценарий фильма для узла.

Cinematic cinematic = new Cinematic(sceneNode, duration);
cinematic.addCinematicEvent(starttime1, event1);
cinematic.addCinematicEvent(starttime2, event2);
cinematic.addCinematicEvent(starttime2, event3);
...
stateManager.attach(cinematic);
  1. Создайте один Cinematic сценарий для сцены.
    • sceneNode — это узел, содержащий сцену (может быть корневой узел).
    • duration — продолжительность всей сцены в секундах.
    • Каждый Cinematic представляет собой набор CinematicEvents, которые запускаются в определенный момент на временной шкале.
  2. Создайте один CinematicEvent для каждой строки вашего сценария фильма.
    • event — это одно движение движущегося объекта. Вы можете добавить несколько событий. Подробнее см. Ниже.
    • starttime — это время, когда конкретное кинематографическое событие начинается на временной шкале. Укажите время начала в секундах с начала cinematic.
  3. Присоедините Cinematic к stateManager приложения SimpleApplication.
  4. Воспроизведение, остановка и приостановка Cinematic из вашего кода.
Методы  Применение
cinematic.play()  Начинает проигрывать кинематографию с самого начала или с того места, где оно было приостановлено.
cinematic.stop()  Останавливает воспроизведение кинематографического изображения и перематывает его назад.
cinematic.pause()  Делает паузу в cinematic.

События (CinematicEvents)

Так же, как сценарий фильма состоит из строк с инструкциями для актеров, каждый Cinematic состоит из ряда событий.

Вот список доступных CinematicEvents, которые вы используете в качестве событий. Каждый трек дистанционно управляет объектами сцены по-другому:

События(CinematicEvents)  Описание
MotionEvent  Используйте MotionEvent для перемещения Spatial нелинейно с течением времени. Событие MotionEvent основано на списке точек маршрута в MotionPath. Кривая проходит через каждую точку маршрута, и вы можете отрегулировать натяжение кривой, чтобы изменить округлость пути. Это интерполяция движения, которую вы собираетесь использовать в большинстве случаев.
SoundEvent  Используйте SoundEvent для воспроизведения звука в заданное время в течение заданного времени.
GuiEvent  Отображает графический интерфейс Nifty в заданное время в течение заданного времени. Используйте его для отображения субтитров или элементов HUD. Привяжите Nifty GUI XML к Cinematic с помощью cinematic.bindUi(“path/to/nifty/file.xml);
AnimationEvent  Используйте это, чтобы начать проигрывать анимацию модели в данный момент времени (например, анимация ходьбы персонажа)

Вы можете добавлять пользовательские события, расширяя AbstractCinematicEvent.

MotionEvent

Событие MotionEvent перемещает Spatial объект по сложному пути.

MotionEvent events= new MotionEvent (thingNode, path);

Подробная информация о конструкторе:

  • ThingNode — перемещаемая область.
  • Path — это сложный MotionPath.

Чтобы создать MotionEvent, выполните следующие действия:

  1. Создайте MotinPath.
  2. Создайте MotionEvent на основе MotionPath.
  3. Настройте свой MotionEvent (см. Ниже).
  4. Добавить MotionEvent в Cinematic.
Методы настройки MotionEvent  Применение
event.setLoopMode(LoopMode.Loop)  Устанавливает, должна ли анимация вдоль этого пути быть зацикленной (LoopMode.Loop) или воспроизводиться только один раз (LoopMode.DontLoop).
event.setDirectionType(MotionEvent.Direction.None)  Устанавливает тип поведения управляемого узла. Direction.None деактивирует эту функцию. Вы можете выбрать один из следующих параметров: LookAt, Path, PathAndRotation, Rotation.
event.setDirectionType(MotionEvent.Direction.LookAt)  Пространственные повороты (вращается), чтобы при движении двигаться лицом к определенной точке. Укажите точку с помощью метода setLookAt().
event.setDirectionType(MotionEvent.Direction.Path)  Пространство всегда движется в направлении пути.
event.setDirectionType(MotionEvent.Direction.PathAndRotation)  Пространство обращено к направлению пути плюс добавленное вращение. Используйте вместе с методом setRotation().
event.setDirectionType(MotionEvent.Direction.Rotation)  Пространственное вращение (вращаются) при движении. Вы описываете вращение пользовательским кватернионом. Используйте вместе с методом setRotation().
event.setLookAt(teapot.getWorldTranslation(), Vector3f.UNIT_Y)  Пространство всегда обращено к этому месту. Используйте вместе с MotionEvent.Direction.LookAt.
event.setRotation(quaternion)  Устанавливает поворот. Используйте вместе с MotionEvent.Direction.Rotation или MotionEvent.Direction.PathAndRotation.
Скорее всего, вы дистанционно управляете более чем одним объектом в своей сцене. Дайте событиям и путям полезные имена, такие как dragonEvent, dragonPath, heroEvent, heroPath и.т.д.

SoundEvent

SoundEvent воспроизводит звук как части кинематики.

SoundEvent( audioPath, isStream, duration, loopMode )

Подробная информация о конструкторе:

  • audioPath — это путь к аудио файлу в виде строки, например. «Sounds/mySound.wav».
  • isStream переключает между потоковой передачей и буферизацией. Установите true для потокового аудио файла, установите значение false, чтобы воспроизводить короткие буферизированные звуки.
  • duration — это время, которое будет воспроизводится.
  • loopMode может быть LoopMode.Loop, LoopMode.DontLoop, LoopMode.Cycle.

GuiEvent

GuiEvents показывает или скрывает NiftyGUI как часть кинематики.

GuiEvent( screen, duration, loopMode )

Вы должны использовать это вместе с bindUI(), чтобы указать файл Nifty GUI XML, который вы хотите загрузить:

cinematic.bindUi("Interface/subtitle.xml");

Подробная информация о конструкторе:

  • screen — это имя загружаемого экрана графического интерфейса Nifty, как String.
  • duration — это время, которое нужно для игры.
  • loopMode может быть LoopMode.Loop, LoopMode.DontLoop, LoopMode.Cycle.

AnimationEvent

AnimationEvent запускает анимацию как часть кинематики.

AnimationEvent( thingNode, animationName, duration, loopMode )

Подробная информация о конструкторе:

  • thingNode — это Spatial объект, анимацию которого вы хотите воспроизвести.
  • animationName названия анимаций, хранящихся в анимированной модели, которую вы хотите вызвать, в виде строки.
  • duration — это время, которое будет воспроизводится.
  • loopMode может быть LoopMode.Loop, LoopMode.DontLoop, LoopMode.Cycle.

Управление камерой

В Cinematics есть встроенная система для переключения камер. Она основана на CameraNode, а Cinematic включить данный control CameraNode в заданное время.

Сначала вы должны привязать камеру к Cinematic с уникальным именем. Вам будет предоставлен CameraNode

 CameraNode camNode = cinematic.bindCamera("topView", cam);

и вы сможете делать все, что захотите, с этим узлом камеры: поместите его так чтобы у вас был угол камеры который вы захотите, прикрепите его к событию движения, чтобы повернуть камеру прикрепите свой собственный control который даст ему все что вы хотите сделать или вам нравиться. В приведенном выше примере я хочу, чтобы это был вид сверху сцены, смотрящей на происходящее в мире.

 // установить своё положение
 camNode.setLocalTranslation(new Vector3f(0, 50, 0));
 // установить его, чтобы посмотреть на происходящее в мире
 camNode.lookAt(Vector3F.ZERO, Vector3f.UNIT_Y);

Тогда мне просто нужно запланировать его активацию в Cinematic. Я хочу, чтобы он активировался через 3 секунды после начала Cinematic, так что мне просто нужно сделать

cinematic.activateCamera(3,”topView”);

Адаптации

Вы можете продлить отдельные CinematicEvents. В примере SubtitleTrack.java показано, как расширить GuiTrack до субтитров сценария. Посмотрите, как используются субтитры в примере TestCinematic.java.

Вы также можете создать новый CinematicEvent, расширив AbstractCinematicEvent. AbstractCinematicEvent реализует интерфейс CinematicEvent и обеспечивает управление продолжительностью, временем, скоростью и.т.д. Посмотрите, пример TestCinematic.java, чтобы использовать это для пользовательского эффекта fadeIn/fadeOut в сочетании с com.jme3.post.filters.FadeFilter.

Взаимодействие с кинематикой

CinematicEventListener

CinematicEventListener cel = new CinematicEventListener() {
  public void onPlay(CinematicEvent cinematic) {
    chaseCam.setEnabled(false);
    System.out.println("play");
  }

  public void onPause(CinematicEvent cinematic) {
    chaseCam.setEnabled(true);
    System.out.println("pause");
  }

  public void onStop(CinematicEvent cinematic) {
    chaseCam.setEnabled(true);
    System.out.println("stop");
  }
}
cinematic.addListener(cel);

Взаимодействие с физикой

На подходе


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

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

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