— Теория о системе координат (правосторонней и левосторонней)
— Теория правильного создания 3d моделей в blender
— Быстрый экспорт файлов из Blender в Unity3d.
— Как правильно сопоставить масштабы модели в Blender и Unity.
— Экспорт с правильной ориентацией модели
— Почему количество вершин по-разному отображается в Unity и Blender?

Скрипты для автоматического экспорта из Blender в Unity3d (Ссылку предоставил пользователь darkfrei )

Видео к статье


Blender урок №1

Blender урок №2

Blender урок №3

Бонусный урок по текстурам в Unity3d


Теория о системе координат (правосторонней и левосторонней)


На самом деле это самая важная часть, я столкнулся с рядом проблем в работе физики 3d модели из-за неправильного экспорта. И так давайте сначала познакомимся с системой координат правосторонней и левосторонней.

Blender использует правостороннюю систему координат с осью Z, направленной вверх. Такую систему координат используют почти все САПР. Смотрите рисунок:

image

Unity3d как почти любой другой игровой движок использует левостороннюю систему координат. Когда Y направлен вверх, X — вбок, Z- вперед. Смотрим рисунок:

image

Теория правильного создания 3d моделей в blender


Для начала надо изучить структуру папок и файлов нашей 3д модели в Blender.
Refence — папка в которой могут хранится вспомогательные чертежи, рисунки, которые помогают построить 3д модель
Textures — папка в которой должны хранится текстуры.
Flags_snow.blend — наша 3d модель в формате blender



Теперь для правильного экспорта 3d модели, мы должны для себя уяснить, что Z+ это будет направление в игре когда объект движется вперед, (Z-) — направление когда объект движется назад. (X+-) это направления поворота вбок — но это в Unity, которая использует левостороннюю систему координат. А в правосторонней системе координат (Blender, 3ds max) Y+ это будет направление когда объект смотрит вперед и (X+-) это направления вбок. Это значит что объект должен стоять в сцене так, как на рисунке, в противном случае ждите проблем с физикой:



Все параметры вращения должны стоять на 0 для дальнейшей работы и для правильной генерации Меша (Mesh), надо Scale установить по умолчанию. Для этого мы сделаем следующие действия в Blender.

1)Выделим все объекты в сцене (клавиша A)
2)Object>Apply>Rotate & Scale.

Теперь все параметры вращения приняты и установлены на 0. А параметры масштабирования (Scale) установлены на по умолчанию (1). Смотрим рисунок:

image

Благодаря пользователю Leopotam, выяснилось что назначать текстуру, лучше в самом Unity3d, а не в Blender, в противном случае, при каждом экспорте FBX файла у вас будет создаваться папка object.fbm (пустая папка которая не на что не влияет, кроме как создает лишний объект в окне Project.

Экспорт с правильной ориентацией модели


Теперь можем делать «Правильный экспорт» из правосторонней системы координат в левостороннюю систему координат.

1)Выделим все объекты (клавиша A)
2)Жмем последовательность R>X>-90.
3)Object>Apply>Rotate.
4)Жмем последовательность R>X>90.

Обязательно делайте в данной последовательности. Далее экспортируем модель в Unity. File>Export>FBX со следующими настройками:



Быстрый экспорт файлов из Blender в Unity3d.


После экспорта модели:
1) Идем в папку с этой моделью и копируем папку Textures (папку с текстурами) и наш FBX файл.



2) Вставляем в папку Assets нашего проект. Это позволит Unity импортировать модель прямо с текстурами, которые были настроены в Blender.



Почему количество вершин по-разному отображается в Unity и Blender?


Как мы видем на рисунке количество вершин (verts) на объекте в Unity3d показывает 28.
Смотрим рисунок:


А количество вершин в Blender = 8



Связано это с тем, что в Unity3d подсчитывается количество вершин самой фигуры и количество вершин в UV развертке:



При создании швов, одна грань разделяется на 2 грани, а следуя математике 1 грань состоит из 2 вершин, следовательно из 2ух граней будет 4 вершины. Для примера воспользуемся Smart UV Project разверткой и установим максимальный Angle Limit.



Смотрим в Blender и количество вершин сократилось с 28 до 24 вершин. Если у кого есть более оптимизированный способ. Пишите в комментариях, обсудим. Некоторые скажут что что сократилось всего на 4 вершины, а представьте если таких объектов 100 или 200, или количество вершин в более детализированных объектах сократиться на 100-300. Помойму не плохой способ оптимизации.



Как правильно сопоставить масштабы модели в Blender и Unity.


Все единицы измерения, что в Blender что в Unity поумолчанию имеет единицу измерения Units. 1 Units= 1 Meter . Поэтому разработчики советуют принимать 1 юнит игрового пространства за 1 реальный метр, и лучше этого придерживаться (хотя бы чтобы с физикой меньше возиться).
И так разберемся с единицами измерения в Blender, в прицнипе в Blender их можно менять, но поумолчанию в Blender используется Units.

Смотрим на рисунок:



Видем параметр Dimension (Измерения или размер). на рисунке мы видем Dimension по X,Y,Z = 1,1,1; следовательно эта фигура куб с размерами 1х1х1 метр. Экспортируем в Unity и переходим на вкладку Inspector



смотрим на параметр Scale Factor, если у вас Unity версии меньше 5, то поумолчанию Scale Factor будет 0.01, исправим этот параметр на 1, если у вас Unity5 то Scale Factor поумолчанию будет 1.

Заключение


Вот и вся статья, как видем экспорт 3d модели из Blender в Unity, это не такуж то и сложно. Для более детального рассмотрения данного материала предлагаю посмотреть видеоуроки в начале статьи >> ссылка

Дополнение от Leopotam


Leopotam:
Ничего не было сказано, что нельзя вешать в материал текстуры (только то, что в UV-окне), иначе юнити начнет создавать папки типа object.fbm и пытаться импортировать текстуры в них независимо от того, что лежит в соседней папке Textures. Тут кроется проблема — их бесполезно удалять, при следующем переимпорте (например, при заборе репозитория в новую папку или смене целевой платформы) ассета папка появится снова. Единственное решение — правильно готовить это дело в блендере. Ну или отключать импорт материалов и настраивать префабы руками.

Ответ:
Да действительно в Unity 5 начали создаваться данные папки (при первичном импорте) раньше их не замечал, но они пустые и их можно удалить (они создаются только при первичном импорте) и текстуры ищет в папке Textures и применяется Шейдер в зависимости от настроек материала, если материал стандартный и то примениться Diffuse с уже настроенной текстурой, если Transperty применен в материалах, то примениться соответствующий шейдер Transperty в Unity3d и текстура тоже примениться. Сменил целевую платформу, с Web Player на Desktop — ничего не поменялось, папки не создались. Сменил на Ios — ничего не поменялось. Unity 5.0.1f1

Leopotam:
Ничего не было сказано, что если экспортируется арматура с анимациями, то нельзя использовать FBX 7.4 BINARY формат, только старый FBX 6.1 ASCII, иначе все в юнити поедет в стиле «кровькишкирас...».

Ответ:
Спасибо за дополнительную информацию, с анимацией в Blender не работал и собственно в разрабатываемом проекте не требуется костная анимация, поэтому мало знал о данном материале.

Комментарии (25)


  1. darkfrei
    05.04.2015 13:32

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


    1. patch1 Автор
      05.04.2015 13:41

      А если набить руку и вникнуть в тему, то и в автоматизации нету смысла. К примеру если модель построена не правильно, ее с начало надо «выровнять» согласно координатам на скриншоте. А потом производить экспорт. А если не знать этих азов, ты сильно удивишься когда у тебя Mesh 3д модели будет задом на перед. второе, если модель с анимацией то к экспорту надо применить экспорт Armature. Собственно можно всё. Лично я этот экспорт делаю уже на автомате за 10 секунд и без автоматизации. 3ий факт, я показал на примере блендер и Unity но этот же способ применим и к 3ds max + Unity и Blender + UE. В 3ds max тоже есть MaxScript и там тоже можно написать скрипт, кому надо тот напишет в принципе.


      1. darkfrei
        05.04.2015 14:16

        Краткий гуглинг подсказал ссылку на два скрипта.


        1. patch1 Автор
          05.04.2015 14:27

          В статье кроме «Экспорта» еще и мелкие нюансы, в качестве подготовки, теории, а после и сопоставление масштабов. Не уместно было бы вставлять «Два скрипта экспорта» не показывая как работать без них. Но за ссылку спасибо, добавлю в статью в качестве дополнения. Я даже как то и не думал скрипты искать. Добавлено в начало статьи.


  1. Leopotam
    05.04.2015 16:38
    +2

    Вся статья сводится к 2 фразам:
    1. Не делай лишних разрывов в UV, каждый вертекс на границе куска (island, если в терминах блендера) развертки будет продублирован в меше N-раз, где N — количество кусков UV.
    2. Перед экспортом нажимай R,X,-90,Enter,ctrl+A,Apply Rotation&Scale,R,X,90,Enter, потом экспортируй в FBX с настройками осей по умолчанию.

    Все остальное — вода.

    Ничего не было сказано, что нельзя вешать в материал текстуры (только то, что в UV-окне), иначе юнити начнет создавать папки типа object.fbm и пытаться импортировать текстуры в них независимо от того, что лежит в соседней папке Textures.

    Ничего не было сказано, что если экспортируется арматура с анимациями, то нельзя использовать FBX 7.4 BINARY формат, только старый FBX 6.1 ASCII, иначе все в юнити поедет в стиле «кровькишкирас...».


    1. patch1 Автор
      05.04.2015 19:32

      Спасибо большое за дополнение, но поповоду " юнити начнет создавать папки типа object.fbm и пытаться импортировать текстуры в них независимо от того, что лежит в соседней папке Textures." Да действительно в Unity 5 начали создаваться данные папки (при первичном импорте) раньше их не замечал, но они пустые и их можно удалить (они создаются только при первичном импорте) и текстуры ищет в папке Textures и применяется Шейдер в зависимости от настроек материала, если материал стандартный и то примениться Diffuse с уже настроенной текстурой, если Transperty применен в материалах, то примениться соответствующий шейдер Transperty в Unity3d и текстура тоже примениться. Насчет арматуры и анимации не говорил потому что у меня нету костей в игре) и следовательно не могу ничего и сказать об этом. Но за информацию спасибо буду иметь ввиду. Поповоду статья сводится к двум фразам не согласен, мало где говорится об правосторонней и левосторонней системе координат, мало где говорится что можно в самом блендер изменить масштабы исхожной модели в Юнитах (которые равны метрам) собственно каждый из статьи подчерпнул что то себе.


      1. Leopotam
        05.04.2015 19:37

        в Unity 5 начали создаваться данные папки

        5-ка ничего нового не привнесла в этом плане, в 4-ке все было точно так же.
        они пустые и их можно удалить

        Тут кроется проблема — их бесполезно удалять, при следующем переимпорте (например, при заборе репозитория в новую папку или смене целевой платформы) ассета папка появится снова. Единственное решение — правильно готовить это дело в блендере. Ну или отключать импорт материалов и настраивать префабы руками.


        1. patch1 Автор
          05.04.2015 19:42

          Я сам думал что 5ка нечего не принесла в новом плане, как оказалсь Scale Factor уже не 0.01 при импорте как было в 4.6, а теперь 1.


          1. Leopotam
            05.04.2015 19:45

            Разговор был не про импорт FBX-ов вообще, а про папки интегрированных текстур. Размер единицы измерения скорее всего просто стал корректно импортироваться из файла.


            1. patch1 Автор
              05.04.2015 19:55

              Сменил целевую платформу, с Web Player на Desktop — ничего не поменялось, папки не создались. Сменил на Ios — ничего не поменялось. Unity 5.0.1f1


              1. Leopotam
                05.04.2015 19:57

                После alt+tab-а ничего не появилось?


                1. patch1 Автор
                  05.04.2015 20:07

                  данная комбинация вызывает меню Assets. И нет не появилось


                1. Leopotam
                  05.04.2015 20:09

                  Ну и как гарантированный вариант — закрыть юнити, удалить папку Library (должны остаться 2 папки — Assets и ProjectSettings) — при следующем открытии проекта произойдет принудительный реимпорт.

                  данная комбинация вызывает меню Assets. И нет не появилось

                  Имелось ввиду потеря фокуса окном юнити (переключение на другое приложение и обратно).


                  1. patch1 Автор
                    05.04.2015 20:15

                    1) Имелось ввиду потеря фокуса окном юнити (переключение на другое приложение и обратно). — Нет ничего не появилось.
                    2) А нафига постояно переимпортировать файлы? когда эт нужно? если у вас репозиторий, и все файлы переимпортируются значит вы скорее всего не тащите папки Library с репозитория, а нафига это делать? представьте крупный проект 1к 3д моделей, большая туча текстур и сколько эт будет переимпортировать каждый раз когда вы затрагиваете данные с репозитория? в том то и фишка папки Library что бы хранить данные настроек о каждом файле. По вашему в блендере надо делать развертку но при этом ненадо применять текстуры к материалу в самом блендере? можно, но тогда придется в самом Юнити назначать текстуру)


                    1. patch1 Автор
                      05.04.2015 20:24

                      Собственно чем мешают эти папки которые можно удалить?)


                      1. Leopotam
                        05.04.2015 20:27

                        Нет ничего не появилось.

                        Хм, странно. А импорт материала стоит в настройках импорта файла?
                        А нафига постояно переимпортировать файлы?

                        Ну вот по идее при смене платформы и переимпорте текстур (если стоит сжатие + автосжатие в настройках + переключение между десктопом / iOS / android) происходит и переимпорт интегрированных текстур — папки появляются снова. Возможно тут проблема как раз в текстурах и автоимпорте. Если автоимпорт отключить, то сжатие происходит в момент билда.
                        в блендере надо делать развертку но при этом ненадо применять текстуры к материалу в самом блендере?

                        Именно. В блендере есть 2 варианта применения текстур — через UV faces (это то, что цепляется в окне редактирования развертки) и то, что цепляется как слоты на следующей после Material вкладке свойств (что используется для рендера внутри блендера). Вот косяки появляются если использовать второй способ, верный только первый. Т.е. можно видеть текстуры в 3д виде блендера даже если они прицеплены только в UV-редакторе.
                        не тащите папки Library с репозитория, а нафига это делать?

                        Потому что Library не должен быть в репозитории, это локальный бинарный кеш, специфичный для каждой машины и постоянно меняющийся в зависимости от действий пользователя (даже при мелких незначительных изменениях внутри редактора). При подготовке проекта к репозиторию делается настройка «Force text» при сериализации и делаются исключения для всех папок за исключением Assets и ProjectSettings.


                      1. Leopotam
                        05.04.2015 20:28

                        Когда проект под контролем системы версий, эти постоянно появляющиеся папки напрягают. Проект должен быть чистым :)


                        1. patch1 Автор
                          05.04.2015 20:34

                          Хм, странно. А импорт материала стоит в настройках импорта файла?

                          да стоит)

                          Ну вот по идее при смене платформы и переимпорте текстур (если стоит сжатие + автосжатие в настройках + переключение между десктопом / iOS / android) происходит и переимпорт интегрированных текстур — папки появляются снова. Возможно тут проблема как раз в текстурах и автоимпорте. Если автоимпорт отключить, то сжатие происходит в момент билда.

                          100% скажу что билдил под Windows Desktop и Web Player — папки не появлялись, сжатие было.
                          Потому что Library не должен быть в репозитории, это локальный бинарный кеш, специфичный для каждой машины и постоянно меняющийся в зависимости от действий пользователя (даже при мелких незначительных изменениях внутри редактора). При подготовке проекта к репозиторию делается настройка «Force text» при сериализации и делаются исключения для всех папок за исключением Assets и ProjectSettings.
                          Точно, перечитал статью которую переводил, там тоже об этом сказано, но ведь не все же модели с репозитория тянутся, а только тех что нету? в любом случае будет выбор, удалить масово папки .fbm, или каждой модели искать и назначать текстуру)


                          1. Leopotam
                            05.04.2015 20:43

                            Вот пример. Новый тиммейт, затягивает репозиторий в чистый каталог, либо реши провести какие-то эксперименты и сделал новую ветку в отдельном каталоге, чтобы не переключаться подолгу на толстом в плане контента проекте. Вот там и будет засада — папочки молча создадутся и будут светится как новые. Ну и однажды кто-нибудь их зальет :) В командной работе все должно быть максимально формализовано и структурировано. И никакого мусора в контенте — пару раз отбить конечности моделлеру линейкой и он навсегда запомнит как надо делать, разработка пойдет гораздо продуктивнее без постоянного мониторинга.


                            1. patch1 Автор
                              05.04.2015 21:21

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


                              1. Leopotam
                                05.04.2015 21:58
                                +1

                                Зачем такие сложности, если достаточно просто генерировать правильный контент? В 5-ке уже сделали одну «оптимизацию» для особо умных дизайнеро-моделлеров — если в текстуре альфа 100%-ная и сплошная, без дыр, то она принудительно вырезается. И юнити абсолютно все-равно, нужна она в ресурсах или нет — теперь ее не будет. После этого сборка атласов нового UI начинает адски глючить — пытается все такие текстуры запихать в отдельный атлас. Приходится внимательно перелопачивать кучу спрайтов и где альфы нет — втыкать Advanced и настраивать свойства импорта вручную. А все почему? Потому что текстуры с альфой сжимались с потерями и ломалось качество, а вырезать альфу при подготовке контента — дизайнеры выше этого. В результате страдают все.


                                1. patch1 Автор
                                  06.04.2015 10:16

                                  в принципе да, согласен как то я все усложнил, спасибо большое за разъяснение) как полезно иногда обсуждать)


                                  1. akjoler
                                    06.04.2015 11:52
                                    +1

                                    У вас может галочка эта не стоять: gyazo.com/fa4a7d077385c95baabd4833cbe29b89, а также 2 нижних выпадающих меню различаться. От этого зависит где и как Юнити ищет материалы. Это в свойствах FBX.


  1. Leopotam
    05.04.2015 20:26
    +2

    промахнулся


  1. engine9
    06.04.2015 13:57
    +1

    Спасибо за актуальнейшую и полезную инфу.