Анимация
Поддержка анимации на основе динамической обработки 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.
- jMonkey CSG — Конструктивная Сплошная Геометрия
- Spatial-ы
- Фигуры
- Освещение/Физика/2D Поверхности
- Обсуждение на форуме: Другое CSG решение
Переведено для jmonkeyengine.ru, оригинал.
Автор перевода: Andry
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.