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

Создание ресурсов в Blender3D

Опубликованно: 11.05.2017, 19:34
Последняя редакция, Andry: 20.02.2018 8:34

В этом разделе обсуждается, как создавать и импортировать модели из Blender3D (2.78+, см. в нижней части урока для Blender 2.49 и более раннего) в jME3. Кроме того, в нем объясняется, как вы можете создавать различные стандартные игровые ресурсы(assets), такие как карты нормалей(normal maps), высокополигональные модели и baked карты освещения(lighting maps).

Asset Management

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

Создание моделей

Модели, совместимые с играми, представляют собой модели, которые в основном состоят из сетки(mesh) и UV-отображение текстур, в некоторых случаях для анимаций. Все другие параметры материала или эффекты (например, частицы и.т.п.) не могут быть переданы должным образом и вероятно в любом случае не будут перенесены на визуализацию(рендеринг) в реальном времени.

UV Отображение Текстур

Чтобы успешно импортировать текстуру, текстура должна иметь UV-отображение на модель. Вот как вы можете задать diffuse(диффузные), normal(нормалей) и specular(зеркальные) карты:

  • blender-material-4
  • blender-material-3
    • blender-material-2
    • blender-material-1

Важно отметить, что каждая используемая текстура создаёт одну отдельную геометрию. Поэтому лучше всего комбинировать UV-отображения или использовать предварительно созданный атлас с разными типами текстур с самого начала, а затем сопоставить uv-координаты моделей с атласом вместо рисования на текстуре. Это лучше всего подходит для крупных моделей, таких как города и космические корабли.

Анимации

Анимация для jME3 должна быть анимацией костей, простые движения объекта поддерживается импортером blender, деформации сетки или другие формы анимации не поддерживаются.

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

  1. Создать модель
    1. Убедитесь, что местоположение, вращение и масштаб вашего модели применены и ноль/один (см. «Контрольный список моделей ниже»)
      Знали ли вы? Вы можете сделать любую модель из куба, используя только выдавливание, это позволяет создавать очень чистые сетки
  2. Создайте скелет(armature) костей, не забывайте иметь хотя бы одну корневую кость!
    1. Начните с установки курсора на ноль.
    2. Перейдите в меню Добавить ▸ Скелет ▸ Одна кость и создайте корневую кость
      • blender-add-bone
    3. Выберите кость и в окне Свойства на вкладке Данные в пункте Отображение поставьте галочку для Рентген что бы кости отображались сквозь объект.
    4. Выберите кость и перейдите в режим правки (нажмите Tab).
    5. Выберите конец корневой кости и нажмите E, чтобы начать выдавливание кости, затем начните оснащать свою модель костями таким образом
      Убедитесь, что местоположение, поворот и масштаб скелета применены (см. «Контрольный список моделей ниже»), прежде чем продолжить
  3. Сделать скелет(armature) родителем модели
    • Убедитесь, что вы снова в режиме объекта (нажмите Tab еще раз)
    • Сначала выберите объект модель, затем выберите объект скелет с нажатой клавишей Shift, затем нажмите Ctrl+P
    • Когда вы это сделаете, вы можете выбрать, как группы костей будут сопоставляться с вершинами модели с самого начала. Выберите [С автоматическими весами]
      Когда ваш родитель вашей сетки в скелете, Blender автоматически добавляет модификатор Скелет(Armature) к сетке.
      blender-make-armature
      Вуаля, ваша модель должна двигаться, когда вы перемещаете кости в режиме позы.
  4. В заголовке Информация нажмите кнопку [Выберите разметку экрана] и выберите компановку Animation.
  5. В окно Экспозиционный лис выберите Редактор Действий
    • blender-action-editor
  6. Добавьте действие, нажав кнопку [+ Создать]
  7. Установите Режим вращения кости в Кватернион или переключитесь позже из Режим вращения в Кватернион и создайте ключевой кадр. Это делается в панели дополнительных свойств которая открывается при нажатии клавиши N.
    blender-switch-rotationmode
  8. Создавайте Ключевые кадры (выберите скелет модели и нажмите I) во временной шкале.
    blender-add-keyframes

    Каждое действие будет анимацией, доступной через animation control в jME после импорта.

    Нажмите кнопку [F] которая рядом с Аction, чтобы анимация было сохранена, даже если на неё никто не ссылается. Анимация будет удалена, если не сохранить активную анимацию на скелете(armature) и файл.

Контрольный список(Model Checklist)

Иногда вы не создаете модель сами, а берёте модели из Интернета, которые зачастую не созданы для рендеринга в режиме реального времени в OpenGL или не полностью совместимы с системой костей jME.

Чтобы экспортировать анимированную модель в Blender, убедитесь, что выполнены следующие условия:

Этот контрольный список сделан интерактивным для вашего удобства.

Анимация должна быть анимацией костей.
Примените Положение, Вращение и Масштаб к сетке в Blender: в редакторе 3D-вида в Blender выберите сетку в Режиме объекта и перейдите в заголовке редактора 3D-вида ▸ меню Объект ▸ Применить ▸ Положение / Вращение / Масштаб.

blender_apply_mesh
Текст на картинке: Сетка: Положение, Вращение и Масштаб применяются.

Примените Положение, Вращение и Масштаб к скелету(armature) в Blender: в редакторе 3D-вида в Blender выберите скелет в Режиме объекта и перейдите в заголовок редактора 3D-вида ▸ меню Объект ▸ Применить ▸ Положение / Вращение / Масштаб.

blender_apply_bones
Текст на картинке: Скелет: Положение, Вращение и Масштаб применяются.

Установите точку начала сетки у основания(нижней части) сетки (см. Изображение ниже).
Установите точку начала скелета у основания(нижней части) скелета (см. Изображение ниже).
Точка начала скелета и точка начала меша должны находиться в одном и том же месте (см. Изображение ниже).
Используйте корневую(root) кость, расположенную в начале скелета. Эта корневая кость должна находиться в вертикальном положении (см. Изображение ниже), и это корневая кость скелета. Если вы вращаете корневую кость, весь скелет может вращаться при импорте модели в jMonkey
Уберите галочку:

    Обёртка кости (Bone Envelopes)

    в модификаторе Скелет для сетки (см. Изображение ниже).

    blender_envelopes
    Текст на картинке: Armature’s root bone — Корневая кость скелет, Armature’s origin point — Точка начала скелета, Mesh’s origin point — Точка начала сетки, Unchecked — Уберите галочку.

Под вкладкой Данные скелета убедитесь, что тип кости — 8-гранник(Octahedral) (см. Изображение ниже).

blender_rootbone2

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

final Material soldier2Mat = assetManager.loadMaterial("Materials/soldier2/soldier2.j3m");
final Spatial soldier2 = assetManager.loadModel("Models/soldier2/soldier2.j3o");
TangentBinormalGenerator.generate(soldier2);
soldier2.setMaterial(soldier2Mat);

final Node soldier2Node = new Node("Soldier2 Node");

soldier2Node.attachChild(soldier2);
rootNode.attachChild(soldier2Node);

final AnimControl animControl = soldier2.getControl(AnimControl.class);
animControl.addListener(this);
final AnimChannel animChannel = animControl.createChannel();

final SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", animControl.getSkeleton());
final Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Green);
mat.getAdditionalRenderState().setDepthTest(false);
skeletonDebug.setMaterial(mat);
soldier2Node.attachChild(skeletonDebug);

blender_finished

Также ознакомьтесь с этими видео и ресурсами:

Запекание Карты Нормалей(NormalMap baking)

Модели для рендеринга в режиме реального времени должны иметь низкое количество полигонов. Для увеличения воспринимаемой детализации модели в играх обычно используют Карты Нормалей(Normal map). В этом уроке будет показано, как создать Карту Нормалей из «Высоко полигональной» версии вашей модели, которую затем вы сможете применить к «Низко полигональной» версии вашей модели в игре.

Низко и Высоко полигональное моделирование в Блендер.(Blender modeling lowPoly & highPoly)

Способ 1

Если вы используете модификатор Мультиразрешение(Multiresolution), вам нужен только один объект. Давайте посмотрим на этот пример, Blender объект Обезьяна, с применённым модификатором Триангуляция(Triangulate):

monkey

  1. Добавьте объект «Обезьяна», выбрав кнопку [Обезьяна], расположенную на вкладке Создать в панели инструментов.
    1. В Режиме объекта в панели Свойства на вкладке Модификаторы добавьте модификатор Триангуляция(Triangulate) и примените его:
    2. В Режиме объекта в панели Свойства на вкладке Модификаторы добавьте модификатор Мультиразрешение(Multiresolution):
    3. 3.1

    4. Существует два типа модификаторов: Катмул-Кларк(Catmull-Clark) и Простой(Simple).
      • Простой(Simple) лучше для вещей, таких как стены или полы.
      • Катмул-Кларк(Catmull-Clark) лучше подходит для таких объектов как сферы.

      При использовании Катмул-Кларк с более высоким значением Подразделить(subdivide) (более 3-х) полезно иметь значение Предпросомтр выше 0 и меньше уровня Подразделить. Это потому что Катмулл-Кларк сглаживает вершины, и поэтому Карта Нормалей не такая точная.

      Независимо от выбора, чем больше разница между Визуализация и Предпросомтр, тем глубже детали будут получатся на Карте Нормалей.

      • Вот например Предпросомтр 1, он более гладкий, чем исходная сетка:

      monkeyprev1

  2. В заголовке Файл в верхней части 3D-вида нажмите кнопку [Выбрать разметку макета экрана] и выберите «UV Editing».
  3. В окне 3D-вида выберите «Обезьяну» и нажмите Tab для перехода в Режим правки.
  4. Если вершины Обезьяны еще не выделены, то нажимайте клавишу A, до тех пор пока не будут выделены все вершины.
  5. В заголовке 3D-вида выберите Полисетка ▸ UV развёртка ▸ Умное UV проецирование.
    1. Нажмите кнопку [▸] на против пункта Отступ для островов один раз, чтобы увеличить значение до 0,3.
    2. Нажмите [Да], когда это сделаете.
  6. В Редакторе UV/изображений нажмите кнопку [+ Создать].
    1. Измените название например на «monkey_bump».
    2. При желании измените Генерируемый тип на «UV Решетка».
    3. Уберите галочку:
      32 бит
    4. Нажмите [Да], когда это всё это сделаете.
  7. В заголовке Файл в верхней части Редактора UV/изображений нажмите кнопку [Выбрать разметку макета экрана] и выберите «Default(По умолчанию)».
  8. С помощью мыши в 3D-виде перейдите в Режим объекта.
  9. Теперь перейдите в закладку Визуализация и запеките Карту Нормалей, используя ту же конфигурацию, что и здесь:

    4

  10. Запомнить! Текущий эффект предпросомтра влияет на запекание и экспорт сетки!
  11. Вернитесь к разметке макета UV Editing и сохраните изображение, выбрав Изображение ▸ Сохранить изображение как в заголовке Редактора UV/изображений.
Звездочка * рядом с пунктом меню Изображение означает, что изображение еще не сохранено.

monkey_bump

Рисунок 1. Карта Нормалей полученная Способом 1

Этот второй способ дает наилучшие результаты:

Способ 2

  1. Следуйте инструкциям «Метода 1», но перед выпечкой уберите галочку:

    Запечь из мультиразрешения(Bake from Multires)

  2. Сделайте копию вашей сетки (Shift + D)
  3. Удалите модификатор Мультиразрешение из скопированной модели
  4. Удалите все материалы из скопированной модели
  5. Удалить модификатор Скелет из скопированной модели
  6. Выберите модель оригинала (Высоко полигональную)
  7. Перейдите в режим позы, очистите все преобразования позы
  8. Высоко и Низко полигональная(“HighPoly” и “LowPoly”) модели должны быть поверх друг друга
  9. Выберите оригинала модели (Высоко полигональную)
  10. Удерживая клавишу Shift выберите скопированную (Низко полигональную) модель
  11. На панели Свойства на вкладке Визуализация:
      1. Режим запекания: Нормали
      2. Поставьте галочку:
        Выделение к активному(Selected to Active)
      3. Используйте достаточно высокое значение для Отступ(Margin) (4+ пикселя, по крайней мере, для карт 1024×1024).
  12. Запекайте и не забудьте сохранить изображение Карты Нормалей.
Имейте в виду, что при дублировании модели вы также дублируете ее UV-отображение. Это означает, что вашей модели «Высоко полигональной(HiPoly)» и модель «Низко полигональной(LowPoly)» присваивается изображение.

Если вы когда-нибудь увидите эту ошибку:

«Нет объектов или изображений, на которые необходимо осуществить запекание»

Вам либо не хватает изображения для Низко полигональной(LowPoly) модели, либо в Структуре проекта(Outliner), символ камеры (Restrict Render) выключен (выделен серым цветом).

monkey_bump2
Рисунок 2. Карта Нормалей полученная Способом 2

Фиксация цветов Нормалей в Blender(Fixing the normal colors in Blender)

Для Карт Нормалей есть два «стандарта»:

  • DirectX
  • OpenGL

Разница между ними заключается в инвертированном что зеленом канале. Было бы ожидаемым, то что JME поддерживает OpenGL-способ, но на самом деле JME поддерживает DirectX-способ, потому что это то, что поддерживает Blender, и разработчики JME считают, что в процессе работы Blender + JME, так будет проще.

Из-за этого вам нужно исправить цвета, чтобы подготовить Карту Нормалей к её использования с Освещаемыми Материалами JME. Вам нужно инвертировать только зеленый канал, красный и синий каналы должны оставаться неизменными. Кривая для красных и синих каналов должна идти от нижнего левого к верхнему правую, а зеленая — сверху вниз вправо.

Сделайте это после запекания и сохранения исходного изображения Карты Нормалей:

  1. В разметке экрана «UV Editing» в заголовке Редактора UV/изображений выберите Изображение ▸ Инвертировать ▸ Инвертировать канал зеленого.
  2. Сохраните инвертированное изображение в нужном вам месте и используйте его с Освещаемым Материалом JME и Низко полигональной(LowPoly) версией модели.

monkey_bump2_invert
Рисунок 3. Результаты инвертирования Карты Нормалей (на примере Способа 2)

Инвертирование Советы

Если вы соберёте движок из исходников, master branch PBR материал имеет параметр NormalType, который позволяет обрабатывать это в шейдере вместо того, чтобы редактировать Карту Нормалей.

Вы также можете использовать SDK для инвертирования канала:

  1. В SDK [ПК Мыши] кликните по изображению и выберите Edit Texture(Редактировать текстуру).
  2. В заголовке окна нажмите кнопку [Filters](Фильтры) и выберите Invert ▸ Green(Инвертировать ▸ Зеленый).
  3. Если выполнено, сохраните изменение в том же формате, что и исходное изображение, используя Файл ▸ Сохранить.

Это конечный результат запекания Карты Нормалей который вы должны получит. Низко полигональная(Low Poly) модель, выглядит как высоко полигональная(High Poly) модель.

monkey_final
Рисунок 4. Конечный результат (на примере Способа 2)

Запекание Карты освещения(LightMap baking)

Цель этого урока — коротко объяснить, как запекать Карту освещения в blender с помощью отдельного набора текстурных координат, а затем экспортировать модель, использующую эту карту в jME3.

Blender моделирование + текстурирование(Blender modeling + texturing)

  • Создадим сетку в блендере и сделаем её развертку для создания уфс(uvs).

    1

  • На вкладке Полисетка вы можете увидеть наборы Уфс(Uvs), они создадут первую.
    • Вы можете назначить текстуру, я использовал встроенную проверку блендера для этого примера.
  • В этом списке создайте новый, и нажмите значок камеры, чтобы сделать запекание с этим набором. Назовите его LightUvMap.
  • В 3D-виде в Режиме правки выделите все вершины вашей сетки и нажмите U ▸ Развернуть для карты освещения(LightMap pack), затем [Да], будет развернута сетку для карты освещения.
  • Создайте новое изображение, перейдите на вкладку Визуализация и все в конце проверьте раздел Запекание и выберите Тень. Затем нажмите Запечь.
  • Если все пойдет хорошо, будет создана такая карта освещения.

    2

  • Перейдите на вкладку Материал, создайте новый для своей модели и перейдите на вкладку Текстура.
  • Создайте 2 текстуры одну для карты цветов(ColorMap) и одну для карты освещения(LightMap).
  • В разделе Отображение(Mapping) обязательно выберите координаты: UV и выберите хороший набор координат.
    3
  • Затем карта освещения
    4

Импорт модели в SDK и создание соответствующего материала

Как только это будет сделано, экспортируйте вашу модель экспортером ogre (или импортируйте её напрямую через импорт .blend), и превратите её в J3o с помощью SDK.

    Создайте материал для него, используя описание освещения.
  • Добавьте colorMap в слот diffuse map и lightMap в слот карты освещения(light map).
  • Убедитесь, что вы отметили галочкой SeparateTexCoords
    5
  • Это примерно должно быть примерно так:
    6
    Текст на картинке: Вуаля.

Файл .blend, файлы ogre .xml и текстуры можно найти в разделе загрузки кода Google Code Repo Скачайте LightMap.zip.

Моделирование гоночных трасс и автомобилей

Следуйте по ссылке ниже к pdf уроку от rhymez, где я расскажу вам как моделировать автомобиль и правильно его импортировать в jMonkeyengine и редактирование его в редакторе транспортного средства. Плюс, как моделировать простой гоночный трек. Программирование 3D-гоночных машин с помощью jMonkeyEngine

Оптимизация моделей для 3D-игр

Следуйте по ссылке ниже к pdf уроку по rhymez, где я расскажу вам о том, как вы можете оптимизировать свои модели для более быстрого рендеринга. Оптимизация 3D моделей для игр

Запекание SkyBox(SkyBox baking)

Существует несколько способов создания статических изображений для использования в качестве небе в вашей игре. Здесь будут описаны концепции, используемые в блендере, и создано уродливое небо 😄 Проверьте ссылки ниже для других способов и хороших небес.

Куб неба(sky box) представляет собой текстурированный куб, его также можно условно назвать en EnvMap или CubeMap. Камера находится внутри куба, и умная вещь, которую делает jME, заключается в том, чтобы рисовать небо так, чтобы оно всегда находилось за всем, что находится на вашей сцене. Представьте себе, что обезьяна на картинке — это камера.

skybox-concept

Но реальное небо — это не куб вокруг наших голов, оно больше похоже на сферу. Поэтому, если мы поместим какое-нибудь старое изображение в небо, оно будет выглядеть странно и может даже выглядеть как куб. Это не то, чего мы хотим. Фокус в том, чтобы исказить изображение так, чтобы оно выглядело как сфера, даже если это на самом деле изображение выставленное на куб. К счастью, блендер может сделать это сложное искажение для нас.

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

Итак, давайте начнем

  • Запустите blender, и вы увидите что-то подобное.

    start-screen2

  • Куб в стартовой сцене идеально подходит для нас. Мы сделаем, так чтобы Blender отображал сцену на этот куб. Получившееся изображение — это то, что мы будем использовать для нашего sky box. Таким образом, наше jME небо будет выглядеть так, как будто мы стояли внутри куба блендера и смотрели на сцену в блендере.
  • Начните с выбора куба и на вкладке Затенение установите для него материал Без затенения(shadeless).

    shadeless

  • Теперь мы создадим текстуру для куба. Убедитесь, что текстура является Картой окружения(Environment Map), и Объект точки наблюдения(Viewpoint Object) установлен на Cube(куб). Разрешение — это то насколько большим будет полученное изображение. Больше пикселей делает небо лучше выглядящим, но стоит за счет памяти затрачиваемой на текстуры. Вам придется урезать разрешение для работы в вашем приложении.

    texture

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

    scene

  • Теперь визуализируем сцену (нажмите клавишу F12). На самом деле не имеет значения, где находится камера в блендере, но вы можете увидеть что-то похожее на это:

    render

  • Вы можете видеть, что Blender фактически нарисовал сцену на кубе. Это именно то, что мы и хотим. Теперь, чтобы сохранить изображение.
  • Выберите текстуру куба и выберите Сохранить карту окружения(save environment map).

    saveenvmap

  • Это для Блендера. Откройте сохраненное изображение в каком-либо графическом редакторе (я использую Gimp отсюда http://www.gimp.org).
  • SDK также содержит редактор изображений, чтобы открыть его щелкните [ПК Мыши] изображение и выберите edit image.
  • Вы заметите, что Blender взял 6 сторон куба и вставил их в одно изображение (3×2). Итак, теперь нам нужно снова разрезать его на 6 отдельных изображений. В gimp я обычно направляю ориентиры туда, где хочу вырезать, а затем перехожу в Фильтры ▸ Веб ▸ Slice…, и пусть gimp разрежет это для меня.

    post-slice

  • Затем следует переместить файлы изображений в нужную папку игровых ресурсов(assets) и создать небо в jME. Вы можете сделать это в Scene Composer, щелкнув [ПК Мыши] узел сцены, выберите Add Spatial ▸ Skybox.

Если вы хотите сделать это из кода, то вот пример:

public void simpleInitApp() {

    Texture westTex = assetManager.loadTexture("Textures/west.png");
    Texture eastTex = assetManager.loadTexture("Textures/east.png");
    Texture northTex = assetManager.loadTexture("Textures/north.png");
    Texture southTex = assetManager.loadTexture("Textures/south.png");
    Texture upTex = assetManager.loadTexture("Textures/top.png");
    Texture downTex = assetManager.loadTexture("Textures/bottom.png");

    final Vector3f normalScale = new Vector3f(-1, 1, 1);
    Spatial skySpatial = SkyFactory.createSky(
                        assetManager,
                        westTex,
                        eastTex,
                        northTex,
                        southTex,
                        upTex,
                        downTex,
                        normalScale);
    rootNode.attachChild(skySpatial);
}
В этом примере используется странный normalScale, это должно отразить изображение по оси X и может не понадобиться в вашем случае. Подсказка: текстура применяется на внешней стороне куба, но мы внутри, и что мы видим?

Далее вы можете почитать:


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

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

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