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

Освещения/Физики/2D Поверхности

Опубликованно: 14.11.2018, 11:29
Последняя редакция, Andry: 15.11.2018 16:30

Я начал трудится над CSG, чтобы удовлетворить свои потребность в программных инструментах построения, которые я могу использовать в других экспериментах. Для достижения этой цели пришлось поддержке CSG несколько выйти за минимальные рамки потребности в объединение/вычитании/пересечении фигур. Ниже перечислены только некоторые возможности, реализованные для удовлетворения моих других личных требований.

Освещение

Я не ожидал, что использование Освещения будет локально привязано к примитивным фигурам, которые смешиваются вместе. В исходном коде не было предусмотрено никаких положений для моего случая, и нужное мне освещение было блаженно проигнорировано. Но я начал работать больше с внутренними пространствами, которые были результатом вычитания меньшего объекта из середины более крупного. Я знаю, что глобально действующее освещение влияет на все поверхности одинаково, без особого знания о внутреннем пространстве. Чтобы получить правильное освещение закрытого/внутреннего пространства, необходимо включить обработку теней.

Ядро движка jMonkey поддерживает обработку теней через Рендеры/Фильтры, привязанные к определенным типам освещения. Но мои эксперименты дали не очень вдохновляющие результаты. Некоторые из эффектов были вполне реалистичными, но было и много примеров просто странных. И частота кадров резко упала. Я готов приписать много причин моему отсутствию понимания, но пока я не смогу получить доступ к более лучшим примерам, мне нужен другой подход.

Так как локальное освещение применяются только к элементам в пределах данного Spatial, я понял, что могу создать некоторый уровень освещения только для интерьера, если я смогу создать узел как часть процесса смешивания. Поддержка нескольких Материалов уже знает, как связать поверхность конечного продукта с исходной примитивной фигурой. Эта процедура была легко расширена, чтобы отслеживать локальное освещение, а также материалы. Конечный результат включает в себя Узел, который содержит локальное освещение, и все элементы поверхности Сетки(Mesh), которые освещаются таким освещением.

Например, если я вычитаю цилиндр из куба, я могу реализовать освещение на сам цилиндр. Это освещение распространяется только на конечные элементы внутренней поверхности, и более нигде. Хотя, конечно, это не комплексное решение того как правильно будут тени, это позволяет мне создавать некоторые хорошие эффекты. Это также хорошо работает с группами под-фигур. Чтобы создать коридор в форме арки, я группирую вместе половину-высоты Куба для дна и Цилиндр для верха. Затем я могу вычесть эту группу из внешней Куба. Добавление света в группу приводит к приятному внутреннему освещению. Добавление локального освещения к внешнему кубу означает, что я могу осветить его снаружи, без просачивания света внутрь.

CorridorLights

По умолчанию jme3-поведение состоит в том, что все освещения расположены в мировом пространстве, даже если они реализованы локально. Целью CSG является создание сложной фигуры из простых примитивов. Когда добавляются освещения, можно было бы ожидать, что преобразование в окончательную фигуру сохранит правильное освещение. Но если освещения расположены глобально, преобразование в окончательную фигуру означает, что свет больше не освещает там, где можно было бы ожидать. Jme3 решает эту проблему через LightControl, который может изменить положение Освещения, поскольку связанный с ним Spatial преобразуется. По умолчанию CSG создаст и назначит соответствующий Control всем локальным освещениям, встретившимся во время смешивания. Он использует настраиваемый CSGLightControl, который лучше поддерживает базовую структуру CSG. Но вы можете отключить эту функцию или предоставить любой другой Control для управления освещением.

Физика

Я не ожидал, что обработка Физики станет неотъемлемой частью CSG в стиле, очень похожем на Освещения. Но по мере того, как я проработал больше тестов, я сделал ставку на требование реализовывать Физику на уровне примитивов, а не пытаться добавить ее извне. В общем, гораздо проще добавить реализации Физики через XML на правильном уровне, а затем система позаботится обо всем этом для вас.

Для этого Физики добавляются так же, как освещения. Физики применяются только к сегменту конечной сетки, соответствующему смешанному примитиву. Поэтому, если вы создаете комнату, вычитая маленький куб из куба большего размера, и вам нужны упругие стены, но инертный(неактивный) пол, вы можете применять перед-гранью физики на разных поверхностях. Окончательная смесь держит все точно для вас.

2D-Поверхности

Основным направлением CSG является смешивание твердых тел. Но я столкнулся с ситуацией, когда захотел поместить твёрдое тело на своем 2D полу без смешивания пола. Разумеется, нет необходимости собирать пол как твердое тело, и я надеялся использовать jme3 Поверхность(Surface) и Ландшафт(Terrain). Обработчик IOB отлично справляется с обнаружением наложения и выбором правильных треугольников для окончательной смешанной фигуры. Вычитание твердого тела и пола дает мне хорошее отверстие, в которые должно пройти твердое тело. Пересечение твердого тела и пола показывает мне, где именно происходит наложение. И объединение дает мне броские фигуры, я не уверен, что это очень полезно (но выглядит корректно).

Я понятия не имею, будет ли обработчик BSP работать должным образом, и я не планирую экспериментировать или работать над ней.


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

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

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