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

Анимация

Опубликованно: 14.11.2018, 17:07
Последняя редакция, Andry: 17.11.2018 14:58

Поддержка анимации на основе динамической обработки CSG не является одной из целей моего дизайна. Я всегда ожидал серьезного падения производительности из-за сопоставления всех поверхностей в одну фигуру в сравнении со всеми поверхностями в некоторых других заданных фигурах. Я предполагал использование CSG во время операции загрузки, что бы потери производительности шли в рамках начальной настройки. Если бы анимация была желательной, я бы допускал, что некоторое N количество кадров должно будет построено-заранее.

Но по-прежнему забавно проверять, что CSG может делать динамически. Достаточно простой тестовый вариант состоит в том, чтобы иметь две фигуры с общим центром, вращающиеся в противоположных направлениях. Затем отобразите их пересечение. С помощью простых кубов (12 треугольников в кубе) вы получаете довольно хороший результат. Замените один из этих кубов на, до некоторой степени гладкий цилиндр, и частота кадров снижается. Вы можете сделать опрос смешанной фигуры после регенерации, чтобы получать количество наносекунд, необходимых для создания фигуры.

Настройка выполняется напрямую. Создайте две фигуры и соедините их с третьей. В цикле обновления примените вращение к двум примитивам, и затем регенерируйте смешанную фигуру. Код CSG перестроит смешение с нуля при каждом вызове регенерации.
скачать видео (которое идёт рывками из-за активной записи, но это происходит довольно плавно в ​​реальной жизни)

Прогрессивная Перестройка

Более практичная форма полуавтоматически применяет прогрессивные изменения к одной целевой фигуре. Эти изменения могут быть вызваны действием пользователя или могут быть непрерывными, двигаясь с любой скоростью, которую может обеспечить ваше железо. CSG структурирована так, чтобы вы могли легко выполнять прогрессивные изменения. Ключевым в этом является то, что возвратом вызова .regenerate() является CSGShape. Эта фигура является единственным результатом предыдущего смешивания и готова к использованию.

Типичным для структуры дизайна является сохранение результата первоначальной .regenerate() в переменной «priorResult». Действие обновления состоит в том, чтобы сначала удалить все фигуры из вашей целевой фигуры, смешать в priorResult, смешать любые новые изменения и затем сохранить результат этого нового .regenerate() в priorResult. Этот цикл обновления можно запустить повторно, включая любые новые изменения в каждом цикле.

Например, CSGTestM начинается с кубического блока «сыра». Цикл обновления — случайное перемещение сферическую «мыши» в пределах одного квадранта блока, а затем вычитает сферу из куба. Каждый результат становится следующей начальной точкой, так как цикл продолжается,и все больше и больше сыра грызёт мышь. Несмотря на то, что анимация не является достаточно гладкой, она по-прежнему является эффективной на экране дисплея.
скачать видео

Многопоточность

Для улучшения поддержки анимации и прогрессивной перестройки процесс сборки CSG был сделан thread aware. Регенерация была разбита на два отдельных шага. Первый включает в себя весё тяжелую работу анализа фигур смешивания, разрешения конфликтов и принятия решения о структуре конечного результата. Второй шаг — применить окончательную фигуру к активной визуальной сцене.

По умолчанию .regenerate() выполняет оба шага. Но вы можете использовать:

 myCSGSpatial.deferSceneChanges( true );

из-за которого регенерацию будет выполнять только первый шаг. Изменения проводятся внутри и в пределах spatial до явного применения:

myCSGSpatial.applySceneChanges();

который обновляет базовую сцену. .regenerate() и .applySceneChanges() являются thread-aware и должным образом синхронизируются. Это означает, что вы можете управлять регенерацией (шаг нагрузки на CPU) из фонового потока и вызывать .applySceneChanges() из стандартного потока jme3 .update(). .applySceneChanges() возвращает true, если работа была выполнена, false если обновления не были применены.

Как часть являющаяся thread-aware, главный внутренние циклы обработки монитор Thread.interrupted(). Если такое прерывание обнаружено, процесс регенерации прерывается и генерируется исключение CSGConstructionException.

Обратите внимание, что CSGConstructionException является RuntimeException, поэтому вызывающему не требуется явно писать код обработки исключений. java.lang.InterruptedException не используется в обработке CSG.

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

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

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