Данная публикация будет скорее опровержением некоторых неточностей в публикации «Секреты экспорта из Blender в Unity». Описанные в ней секреты и, в особенности, скрипты, настолько устарели, что я решился на написание новой статьи.

Раньше были достаточно ощутимые проблемы в Blender при работе с FBX. Blender не понимал общепринятый, если так можно назвать, стандарт Hard edge (они же острые ребра, группы сглаживания, в Blender называются Sharp Edge). Нельзя было экспортировать данные о Tangents. Ну и самая глобальная проблема — некорректные оси у модели при импорте в популярные движки, системы координат которых отличаются от Blender. Но все или большинство проблем уже являются надуманными по незнанию некоторых особенностей. Интересно? Прошу под кат.

Меня зовут Белоусов Леонид. На Хабре это моя первая статья. Я занимаюсь 3D около 8 лет. Сперва это был 3d Max. Потом Maya. Датой начала использования Blender была дата релиза версии 2.5. Да, именно тогда когда в Blender изменился интерфейс, который и присутствует там по сей день. О том, почему выбрал Blender, возможно, напишу отдельную статью, но сейчас не об этом.

Какую версию использовать


На текущий момент версия 2.74.4.

Мои рекомендации по поводу версий. Очень рекомендую использовать 2 версии Blender:

1) Официальная стабильная версия, установленный exe с официального сайта с регистрацией в системе. Это необходимо для некоторых приложений. Например, игровой движок Unity. Unity использует Blender для импорта *.blend файлов. Но если приложение не увидит Blender зарегистрированным в системе, blend файлы в Unity не импортнутся.

2) Ежедневная git-сборка по адресу builder.blender.org/download. Этой сборкой я пользуюсь каждый день. В отличие от стабильной сборки, данная сборка снабжена огромным количеством цветовых тем и плагинов, которые по понятным причинам своей либо ранней разработки, либо еще какой-то обнаруженной нестабильности не попадают в Стабильный релиз. Но по своему опыту скажу, что Blender настолько стабильная программа, что даже ошибки в плагинах ей не страшны. Однако и их встретить достаточно сложно при стандартном использовании этой программы.

Первый пункт — для регистрации Blender в системе (и на всякий случай). Вторым пунктом пользуемся. Наверняка кто-то найдет более универсальный путь, но сути публикации это не изменит.

Углубляться в описание общих значений не буду, так как это сделал автор предыдущей публикации.

Как же нам правильно экспортировать модель в Unity из Blender?


Начну с небольшого ликбеза. Основная проблема Blender заключается в его лицензии. Она открытая. Соотвественно всё, что он использует или включает в себя, тоже должно быть открытым. По этой причине проприетарный экспортер/импортер FBX от Autodesk не мог быть включен в состав Blender. Но люди просили Binary формат и посвежее. По этой причине Blender Foundation начали разработку FBX экспортера/импортера на Python. Поскольку открытых спецификаций как же работает этот формат практически не было, им пришлось не сладко. Но основные трудности на текущий момент преодолены. По крайней мере те, которые мешали экспортировать в FBX.

На текущий момент (лично проверено мною) Blender умеет:
1) Экспортировать данные о Tangents (Unity больше не ругается, что шейдеру нужны Tangents, а их нет в модели), а также запекать Оси (вот она главная возможность!).
2) Импортировать данные о Tangents (этому он научился чуть позже, но — УРА!!! — модели импортируются с Hard Edge).

Основные возможности найдете по ссылке в конце статьи.

Как нам подготовить модель к экспорту


Для начала нам нужно сгладить модель. Сделать это можно как объектном режиме:



Так и в режиме редактирования, выделив все вершины/рёбра/грани (A) и открыв контестное меню Specials (W) выбрать Shade Smooth:



Отлично. Теперь нам надо указать Hard Edge (В Blender — Sharp Edge). Выделим их в режиме редактирования рёбер и открыв контестное меню по работе с Edge (Ctrl + E):



Но что происходит? Почему модель по прежнему сглаженная?



«Добавить модификатор Edge Split надо» — скажут сейчас некоторые! Но нет. Edge split лишь разбивает модель на куски и к эспорту данных в FBX никакого отношения не имеет. Хотя раньше это был единственный способ перенести уже разбитую модель без Tangents в Unity.

Но теперь для генерации нужных данных и работы Hard Egdes нам нужно в меню Vertex Data установить галочку Autosmooth с параметром 180 градусов. Что происходит в данном случае. Этой галочкой мы устанавливаем сглаживание модели в 180 градусов — что фактически близкое к эстремальному. Сглаживание происходит по следующей логике: Слаживаем всю модель, кроме рёбер, которые мы отметили как Острые (Sharp Edge).



По генерации данных Hard Edges мы закончили. Теперь надо разобраться с экспортом.

Разберёмся с осями


Если в Blender нажать 1 на цифровом блоке клавиатуры, вид нашего вьюпорта отцентрируется на вид спереди. Если учесть, что это перед модели, то координаты Blender выглядят следующим: передняя ось Y-, верх — Z+, и боковая часть X+- (в данном случае + это налево, если смотреть сзади модели вперед, как в играх от третьего лица).
Запомним, что если смотреть вперед, находясь сзади модели, то горб должен быть слева и вверху. При этом все данные Location/Rotation/Scale по 0.0.0 и 1.1.1 соответственно.

На данной картинке отмечено, какие оси в Blender и какими они станут в Unity.



Меню экспорта:
1) Белым отмечена вполне обязательная галочка. Я использую для создания моделей под проект практически в одном blend файл (для удобства). Поэтому, чтобы не экспортнулось всё, экспортим только выделенное.
2) Синим отмечен наиболее важный параметр. Это возможность ЗАПЕЧЬ нужные вам координаты в FBX файл. Так как в Unity передняя ось — это Z+, а верхняя ось — это Y+, то мы так и указываем.
3) Красным отмечено то, что попадёт в экспорт вместе с моделью в FBX — Tangents. По которым Unity будет разбивать модель уже в движке.
Используемый формат 7.4 Binary. Использовании текстового формата не имеет смысла, хотя бы потом что он морально устарел. Все новые и актуальные возможности FBX внедряются и поддерживаются в новом 7.4 Binary экспортере на Python.



Импортируем модель в Unity


Открываем модель в Unity и видим несостыковки.
Импортируемая модель отзеркалилась по ОСИ X. Возможно, это связано с тем, что ось X вывернута.



Поэтому возвращаемся в экспортёр Blender и вместо Z+ в Forward ставим Z- как было изначально.
Ура! Всё правильно. И никаких извращений.



Разбираемся с импортом анимации

С костями нет ничего особенного, но разберём по порядку.

Создадим простой куб, вытянутый по высоте. Добавим больше рёбер для костей.



Добавим 3 кости и применим как Armature Deform: Automatics Weight, чтобы не мучатся с развесовкой.





Оси костей стандартные (т.е. кости после создания не поворачивались):



Экспортим.

С моделью все ок:



А вот с костями не всё в порядке:



Что приводит к повороту модели при обнулении Трансформаций:



Но спускаемся на уровень ниже. И видим, что Root кость тоже повёрнута. Вообще, в данной ситуации при экспорте из Blender создается ненужная пустышка перед иерархией костей. Поэтому от неё можно смело избавится.



Все кости с правильными Осями по всей иерархии.

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

По поводу отличающихся данных в Blender и Unity. Данные, на самом деле, не отличаются. Просто Blender в режиме редактирования показывает количество вершин меша. Было бы как минимум странно, если бы Blender показывал общее количество данных.

Куб, который мы экспортировали в Unity, в начале имеет 24 вершины в Blender:



И 72 Вершины в Unity:



Но если сделать в Blender — Render:



То мы видим, что их тоже 72. 72 в данном случае — это количество Вершинных данных. Это и вершины меша, UV0, UV1 (сколько их присутствует и сколько поддерживает движок), а так же кости и даже Vertex Color.

P.S. Всё это написано для тех, кто, как и я, всегда стремится к нормальным осям и обнулённым данным Transform компоненты.
P.S.2 Описание возможностей экспортера/импортера FBX и ToDo список планов на будущее. (В описании указано что в экспериментальной версии уже доступны средства для исправления проблем с поворотами костей.)

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


  1. patch1
    21.04.2015 18:06

    1) Официальная стабильная версия, установленный exe с официального сайта с регистрацией в системе. Это необходимо для некоторых приложений. Например, игровой движок Unity. Unity использует Blender для импорта *.blend файлов. Но если приложение не увидит Blender зарегистрированным в системе, blend файлы в Unity не импортнутся.

    А вот это не рекомендуют делать даже юнитеки) ну как не рекомендуют) больше минусов чем плюсов) подробнее (в самом низу) и опять же будет проблема с направлениями осей (если заранее в Blender правильно не настроить модель)

    Поповоду вершин в Unity и в Blender, коротко говорилось и в прошлой статье) я б сам бы не против посмотреть на примере какого нибудь предмета (с большим количеством вершин) какими методами использовали UV развертку что бы сократить количество вершин) пока что я для себя выделил Smart UV и максимальный Angle (89)

    Поповоду экспорта, направляющие в идеале должны совпадать, только местами должны поменятся Z и Y) попробуйте метод экспорта на движущимся объекте (автомобиле) если в Демо проекте автомобиль едит, а в вашем непонятки, то экспорт не корректен. (автомобиль должен быть создан в блендере и экспортирован вашим методом) Скрипты движущегося автомобиля можно взять из любого демо примера, к примеру вот есть темка

    Еще есть вопросик по поводу махинациями с AutoSmooth — к чему данная демонстранция была, если модель экспортировалась не «Сглаженная» — я наверно что то, не так понял, но вы очень заинтреговали тем что затронули тему сглаживания, а экспортировали не сглаженную модель.

    Тема экспорта анимации и костей действительно очень полезная, которая не в одной из статей не оговаривалась. по этому дополните ее «Скриншотом экспорта модели» окно экспорта из Blender (какую версию экспортера используете, говорят что надо использовать ANSI а не Binary), какие объекты из сцены экспортируете (наверное Mesh, Armature) — всё эт желательно дополнить (вам виднее, я с анимацией пока что дело не имел)

    Вообще тема однозначно полезная) а что по поводу «устарела» с этим я не согласен, с Unity5 до сих пор я использую метод который описывал в той статье (хоть там тоже есть мелкие не доработки) но физика по кране мере работает исправно с моими моделями. Но еще 1 метод экспорта это не сомнено большой и жирный +( если конечно с данным экспортом модели всё работает гладко и Unity не путает перед объекта с его задом)

    Спасибо за статью, надеюсь дополните ее скриншотом)


    1. MorfeusKiev Автор
      21.04.2015 18:26
      +1

      А вот это не рекомендуют делать даже юнитеки) ну как не рекомендуют) больше минусов чем плюсов) подробнее (в самом низу) и опять же будет проблема с направлениями осей (если заранее в Blender правильно не настроить модель)

      Ну я на самом деле вообще против использования собственных форматов проложений. FBX наше всё. При работе в большой команде, устанавливать всем Blender, потому что вы его используете — выглядит весьма эгоистично :)

      Поповоду экспорта, направляющие в идеале должны совпадать

      Вы сами себе усложняете ситуацию. В Любом редакторе есть передняя сторона. По английский она корректнее называется — Front. В Blender это Y-. По сути от этого вы и должны отталкиватся при создании любой модели. Или хотя бы при экспорте (Повернуть то всегда можно). Там где в Blender Front вы вольны ожидать Front в Unity.

      Еще есть вопросик по поводу махинациями с AutoSmooth

      Моя ошибка. Суть заключается в том что сглаживание происходит по принципу «Сгладить всё минус острые углы» которые вы отметили сами. Если не использовать эту галочку — вся модель будет полностью сглаженная. Вероятнее всего вы можете самостоятельно отметить все грани острыми или сглаженными, но этот способ отлично работает при использовании Sharp Edge. Хотя и в этом случае я не уверен, что если вы их не используете, то Tangents экспортнется правильно.

      Тема экспорта анимации

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

      «устарела»

      Я искренне извиняюсь, если задел ваши чувства :) Я не отрицал метод из вашей статьи. Просто на мой взгляд, вы паритесь с поворотами :) Хотя делать этого уже нет надобности :)


  1. patch1
    21.04.2015 18:54

    Вы сами себе усложняете ситуацию. В Любом редакторе есть передняя сторона. По английский она корректнее называется — Front. В Blender это Y-. По сути от этого вы и должны отталкиватся при создании любой модели. Или хотя бы при экспорте (Повернуть то всегда можно). Там где в Blender Front вы вольны ожидать Front в Unity.
    C этим я согласен)
    в любом случае) скоро буду моделировать машину и экспортировать в Unity) опробую ваш метод)

    Моя ошибка. Суть заключается в том что сглаживание происходит по принципу «Сгладить всё минус острые углы» которые вы отметили сами. Если не использовать эту галочку — вся модель будет полностью сглаженная. Вероятнее всего вы можете самостоятельно отметить все грани острыми или сглаженными, но этот способ отлично работает при использовании Sharp Edge. Хотя и в этом случае я не уверен, что если вы их не используете, то Tangents экспортнется правильно.
    Оо сколько не экспортировал с данным феноменом не сталкивался. все модели экспортировались с острыми углами. Но зачем такие манипуляции? в настройках импорта FBX файла (в Unity3d) есть Tangents — Calculate и Import — попробывал и то и другое, разницы 0 было Единственно что при Calculate — можно поставить галочку Split Tangents но опять же разницы 0 было (возможно потому что я объект не сглаживал вот так вот) помойму при Calculate — Unity сам создаст углы на основании данных в FBX, а если поставить Split Tangents то наверно создаст острые углы на основании данных в FBX, не важно они сглаженые или нет. т.е упрощает задачу) и данные манипуляции не потребуются (точно не уверен) но лично с данным феноменом не сталкивался)

    Я искренне извиняюсь, если задел ваши чувства :) Я не отрицал метод из вашей статьи. Просто на мой взгляд, вы паритесь с поворотами :) Хотя делать этого уже нет надобности :)
    Всё норм) чисто эт сеет панику как с выходом Unity 5 (старые уроки не актуальны) словно Unity 5 совершено новый движок)))


    1. MorfeusKiev Автор
      21.04.2015 19:39

      Но зачем такие манипуляции?

      Такие манипуляции обязательны, если вы хотите импортировать, так сказать, кастомную группу сглаживаний. Tangents нужно оставлять в позиции Calculate. А вот Normals — в позиции Import. В данном случае у вас два выбора: Взять из FBX или посчитать на основе заданного угла. Странная особенность. Если указать Tangents Import — то ругается что их нет. Версией Blender назад такого не было. Возможно поломали, но тем не менее — группы сглаживания корректно переносятся.


      1. patch1
        21.04.2015 19:56

        Версия Blender 2.72 на Import Tangents — не ругалось. P.s (стоит по умолчанию Calculate) вот тока не пойму к чему тут Normals — Нормали к манипуляциями над Tangents (сглаживание) в Blender. Ну лан) думаю будет полезно тем кто стокнулся с данной проблемой) я лично с экспортироваными 30 объектами в Unity такого косяка не обнаружил))

        Ну я на самом деле вообще против использования собственных форматов проложений. FBX наше всё. При работе в большой команде, устанавливать всем Blender, потому что вы его используете — выглядит весьма эгоистично :)

        + кстати проект больше весит и при заливке на репозиторий лишняя трата времени. (.blend содержит и сцену и другие объекты и камеры, а FBX только то что экспортировали)


        1. MorfeusKiev Автор
          21.04.2015 20:17
          +1

          не пойму к чему тут Normals

          В данном случае имеется ввиду нормали вершин. Ведь как известно нормаль треугольника это усреднённая нормаль его трех вершин. В местах где ребро острое — вершинки удваиваются. Тоже самое относится и к UV — чем больше вы её разрежете — тем больше будет дублирующих вершин. Соответственно там появляется две нормали вершины. Вот импортёр смотрит на это всё дело, чешет репой и импортирует правильно модель :) Раньше эти данные с Blender просто не экспортировались. Как бы мы не разбивали модель — она всегда будет сглаженной (про острые углы можно было забыть). Единственным выходом было — использование модификатора Edge Splits. Мы разбивали модель так как нам надо (т.е. дублировали вершинки) — еще до экспорта модели. Это было единственным спасением :)


          1. patch1
            21.04.2015 20:37

            честн) опять же в 4.6 и в 5 с таким не сталкивался) а про разъяснение спасибо) не знал что импортируются нормали вершин (думал полигонов) в любом случае полезная информация)


            1. MorfeusKiev Автор
              21.04.2015 20:51

              Надеюсь на то что статья вам поможет в решении всех или почти всех возникающих проблемах :)


        1. akjoler
          21.04.2015 22:40

          На тангенсы можно забить (т.е. ставить None), если модель не использует шейдер с картами нормалей (bumped +...).


  1. patch1
    30.04.2015 19:01

    попробывал ваш способ, у меня лично при

    transform.position =transform.position+ Vector3.forward*2; //ну вот тут все и должно происходить.

    Объект движется задом на перед.


    1. patch1
      30.04.2015 19:25

      А не, все получилось) префаб не обновил, после случая с Z+)) а надо ж потом Z-)


      1. patch1
        01.05.2015 12:47

        Физика вроде нормально работает, только смущает тот факт что в Unity3d Z считает за высоту (при настройке коллайдера на объекте) а Y+ за перед объекта


        1. MorfeusKiev Автор
          01.05.2015 15:23

          В каких случаях она считает Z за высоту… не совсем понял. Опишите пожалуйста что у вас не так.

          З.Ы. Всё никак не найду время обновить статью. Я вообще подумываю сделать отдельную статью по экспорту анимации. Ну посмотрим как будет в будущем.


          1. patch1
            01.05.2015 15:38

            в Unity используется Левостороняя система координат (Y-верх, низ. Z — перед, зад) в Blender правостороняя система координат (Z- верх, низ. Y-перед зад)
            В этом видео вы увидите косяк, где Z — это Верх низ, а Y — перед, зад (косяк при добавлении правки коллайдера объекта) — Своего рода физика объекта воспринимается как то не правильно.


            1. MorfeusKiev Автор
              01.05.2015 15:50

              У вас вверху выбраны Глобальные оси (Global) Выберите локальные. И сейчас объект повёрнут 270 градусов по Х — что тоже самое что -90… т.е. у вас ось Z смотрит точно не вперёд.


              1. patch1
                01.05.2015 16:03

                а я и написал) что у меня Y+ смотрит вперед))) а Z+ смотрит вверх)


              1. patch1
                01.05.2015 16:15



                Вот полное видео, забавно, но при transform.position =transform.position+ Vector3.forward*2 — летит вперед, а вот камера путает верх с низом объекта


                1. MorfeusKiev Автор
                  01.05.2015 16:46

                  Есть подозрение что вы двигаете объект в мировом пространстве.
                  Более того почему вы не выбрали галочку Apply Transform — фактически вы не запекаете координаты. Если вы экспортируете только меш — выбирайте только Меш.
                  И третье — у вас объект стоит задом напередёт в Блендере. Я уже писал что Front в Blender это — Y- (минус).
                  А вот камера у вас возможно копирует локальные координаты.

                  Кстати в Юнити есть офигеннейший глюк. Если на сцене создать пустышку и повернуть её на 90 градусов по X. То при повороте этой пустышки по Оси Z, в игровом режиме, крутится будет ось Y, не смотря на то что объект крутится верно. Но если смотреть по коду, то ожидая изменений оси Z (переменной) изменяется Y.

                  Поверните пожалуйста объект правильно. После того как выносите на сцену обнуляйте все повороты.


                  1. patch1
                    01.05.2015 17:27

                    1)Зачем запекать координаты?
                    2)В данном объекте без разницы Mesh или то что я выбрал) все равно экспортировался Mesh т.к на сцене только Mesh, Camera, Light
                    3)Поменял как вы и сказали) теперь физика пули работает еще хуже)) патрон с тем же скриптом летит теперь не
                    «концом пули» а задом пули, т.к объект перевернулся) камера опять же снизу
                    4) Да я двигаю объект в мировом пространстве, а как иначе его двигать? в локальном пространстве? по вашему все объекты что бы нормально работали надо двигать в локальном пространстве?
                    5)Я импортированый меш, перетаскиваю сразу на сцену и автоматом создается Prefab объекта. в Импортированом FBX объекте нельзя меня поворот объекта. (лично я такого способа не нашел)

                    Есть еще идеи? к слову скрипты камеры настроены правильно) эти камеры взяты из демо проекта)


                    1. patch1
                      01.05.2015 17:33

                      Стоп, нечего не понял) поставил Apply Transform. и теперь всё гуд. Не пойму ведь все координаты и так обнулены, и повороты, и Scale.


                      1. MorfeusKiev Автор
                        01.05.2015 17:56

                        Apply Transform мы говорим Blender поменять оси в FBX файле. Т.е. из Blender мы экспортируем с координатами Y-, X+, Z+. А в FBX файл объект попадает с координатами F+, X-, Y+ (Front, Side, Up). Из-за особенностей юнити, что ось X вывернута в данном случае, мы ставим в экспорте Z-, а не Z+. При импорте в Юнити объект имеет локальное вращение, что абсолютно не мешает ему иметь правильные оси :)

                        Выносите объект на сцену, всё обнуляете, вешаете коллайдер, сохраняете как префаб и у вас всё правильно. В дальнейшем, если вы меняете объект — просто переэкспортируете меш, префаб обновляется и 180 градусный поворот по оси Y вас в этом объекте больше беспокоить не будет.


  1. patch1
    01.05.2015 17:38

    Собственно получилось) тока при раскладе с 0.0.0 Rotation объект импортируется в Unity с -180 по координате Y. Если экспортировать из BLender с координатами 0.0.180. то Prefab на Y будет почти 0 (-1.5). Спасибо за статью, действителньо легче так, чем с Rotation ) ждемс статью по экспорту костей.


    1. MorfeusKiev Автор
      01.05.2015 18:03

      ждемс статью по экспорту костей.

      Хотелось бы найти время :) Работы просто завались. Проект готовится к релизу. Может после релиза, напишу.


      1. patch1
        01.05.2015 18:42

        )) аналогично) спасибо за данный метод) действительно удобней чем с осями возится.