Как импортировать модель в unity3d
Как мне импортировать модели из моего 3D редактора?
Для импорта 3D модели в Unity вы должны перетащить файл модели в окно проекта.
В инспекторе > вкладка Model Unity поддерживает импорт моделей из всех популярных 3D редакторов.
Особенности импорта из разных 3D пакетов смотрите на следующих страницах:
Текстуры
3D форматы
Импортирование мешей в Unity может быть выполнено с помощью двух основных типов файлов:
Любой из этих типов позволит вам добавлять свои меши в Unity, но есть соображения относительно того типа, который вы выберите:
Экспортированные 3D файлы
Преимущества:
Недостатки:
Собственные файлы 3D приложений
Преимущества:
Недостатки:
Модели
Файлы моделей, размещенные в папке Assets внутри проекта Unity, автоматически импортируются и сохраняются как ассеты Unity.
Файл модели может содержать 3D модель персонажа, здания или части мебели. Модель импортируется в виде набора ассетов. В окне Project(проект) главный импортированный объект представляется в виде Model Prefab(префаб модели). Обычно также существует несколько Mesh объектов, на которые ссылается Model Prefab.
Файл модели может также содержать данные анимации, которые можно использовать для анимации данной модели или других моделей. Данные анимации импортируется как один или несколько Анимационных Клипов.

Настройки импорта для мешей
Import Settings для модели будут показаны в закладке Model инспектора FBX импортера, когда модель выделена. Это влияет на меш, его нормали и импортированные материалы. Настройки применяются для каждого ассета на диске, поэтому, если вам нужен ассет с другими настройками, создайте (и соответственно переименуйте) копию файла.
Хотя изначально настроек по умолчанию может быть достаточно, будет лучше, если вы изучите список настроек, перечисленных ниже. Они могут помочь определить, что вы желаете сделать с игровым объектом.
Некоторые общие корректировки, для примера, могут быть следующими:
Импорт 3D-моделей в Unity и подводные камни
Представляем третью статью нашего цикла о работе с 3D-моделями в Unity. Предшествующие статьи: «Особенности работы с Mesh в Unity» и «Unity: процедурное редактирование Mesh».
В мире компьютерной графики существует множество форматов представления 3D-моделей. Некоторые из них позиционируются как универсальные, другие — как оптимизированные под конкретные задачи или платформы. В любой сфере мечтают работать с универсальным форматом, но реальность говорит нам «нет». Более того, из-за такого зоопарка получается порочный круг: разработчики «универсальных» инструментов придумывают свои внутренние форматы для обобщения предыдущих, увеличивая популяцию и плодя средства преобразования форматов. Так появляется проблема потери или искажения данных при конвертации. Проблема стара как мир (мир IT, конечно), и она не обошла стороной импорт моделей в Unity.
В этой статье мы расскажем о некоторых трудностях, с которыми приходится сталкиваться при работе с моделями в Unity (особенности функционирования ModelImporter, разница представлений 3D-объектов и др.), а также о том, какие инструменты мы создали, чтобы эти трудности преодолеть.
Особенности работы ModelImporter
Напомним, что для API видеокарт минимальный и единственный трехмерный примитив — это треугольник, в то время как геометрия в FBX, например, может быть представлена в виде четырехугольников. Современные 3D-пакеты для создания моделей, как правило, допускают различные уровни абстракции, но и там рендер результата происходит посредством треугольников.
При этом многие инструменты заточены на работу именно с четырехугольниками, что подталкивает 3D-художников использовать этот примитив как основной. В таких случаях в ТЗ часто требуется триангулировать модель перед внедрением. Если триангуляцию не сделали, соответствующий модуль Unity в стандартном режиме выполняет ее автоматически при добавлении файла. Из-за этого появляются ошибки, поскольку алгоритмы триангуляции в разных пакетах реализованы по-разному. При выборе диагонали для разбиения четырехугольника возникает неоднозначность, отсюда большинство проблем, которые можно разделить на две группы.
Первая связана с корректностью отображения формы модели. Так, форма непланарного четырехугольника напрямую зависит от выбора диагонали.
Сюзанна, триангулированная в Blender (Quad Method: Beauty) и в Unity (автоматически при импорте)
Кроме того, алгоритм запекания карты нормалей использует данные о разбиении, из-за чего разница в триангуляции может порождать артефакты в виде креста на блике.
Самокат здорового человека и самокат курильщика
Проблемы второй группы встречаются в текстурной развертке. Например, у нас есть четырехугольник с достаточно тупым для возникновения ошибки углом. При предварительном просмотре в 3D-пакете он разбивается одной из диагоналей на два вполне себе складных треугольника.
Исходный полигон
Полигон, триангулированный в Blender
Однако после импорта в проект обнаруживается, что этот четырехугольник разбит другой диагональю и что один из треугольников либо вообще вырожден, либо близок к тому.
Полигон в Unity с треугольником, близким к вырожденному (правый треугольник практически неотличим от отрезка)
Причиной проблем, связанных с вырожденностью полигонов, являются погрешности в вычислениях с плавающей запятой, а также особенности пиксельной интерполяции при рендеринге. С такими треугольниками происходит черт-те что: они дергаются, каждый кадр меняют цвет. Крайне малая величина поперечного сечения создает сложности при обработке света, из-за чего части динамических объектов могут мерцать. Да и в недетерминированности запекания карты освещения тоже нет ничего хорошего.
Я 3D-пакет, я так вижу
В 3D-моделировании часто возникает разница между фактическим количеством вершин и их количеством в 3D-пакете. Суть проблемы заключается в информации, которая требуется для обработки видеокартой. Структура данных для вершины предопределена и включает в себя позицию, нормаль, касательную, координаты текстурной развертки на каждый канал и цвет. То есть в одну вершину две нормали не запихнуть.
Для некоторых художников же не всегда очевидно, что вершина определяется не только своей позицией. Моделлеры прекрасно знают понятия Hard/Soft Edges и UV Seams, но не все осознают, каким образом они реализованы программно. Дополнительно сбивают с толку 3D-пакеты, которые в стандартном режиме показывают количество вершин как количество уникальных позиций.
Так, обычный примитив Cube геометрически представим 8 вершинами. Однако чтобы корректно передать отражение света от каждой грани и правильно наложить текстуру, в каждом углу куба необходимо по 3 вершины с одинаковой позицией, но разными нормалями и текстурными координатами, поскольку в каждом из углов сходится по 3 ребра. Этому моменту посвятили небольшой блок документации. Там же можно посмотреть примеры.
Метрики куба в Blender
Метрики куба в Unity
Хватит это терпеть!
Столкнувшись с этими и подобными проблемами, мы решили создать инструмент анализа и валидации моделей при импорте в проект Unity. Иначе говоря, кастомный валидатор, который на запрос «Ешь!» ответит: «Не буду! Переделывай», — или выплюнет наборы предупреждений и значений различных параметров, оповещая о том, что ему что-то невкусно.
Для анализа и проверки мы разработали следующий функционал:
Подсчеты количества уникальных позиций вершин, Hard Edges, UV Seams и раскрашенных вершин — необходимы для проверки соответствия задуманной художником модели той, что была импортирована в Unity. Этот функционал также позволяет следить за соблюдением требований к оптимизации модели (например, чтобы количество вершин не превышало определенное значение). Из-за все той же особенности 3D-пакетов, которые показывают по факту количество уникальных позиций, бывают случаи, когда метрика числа вершин в редакторе моделей удовлетворяет этому ограничению, однако после внесения файла в проект может оказаться, что это не так.
Вычисление AABB и его центра — позволяет определить смещение модели относительно начала ее собственной системы координат. Это необходимо для предсказуемого позиционирования ассетов, которые инициализируются в сцене уже во время работы приложения. Так, AABB здания по-хорошему должен иметь minY = 0, а какой-нибудь люстры, которая крепится к потолку — maxY = 0.
Выход координат вершин UV-развертки за диапазон 0.0–1.0 — в большинстве случаев (например, если текстура должна тайлиться на модели) предусмотрен. Часто такой подход используется для представления в сцене множества низкодетализированных мелких объектов (растительности) и/или находящихся вдалеке, а также замощения больших однородных объектов (зданий). В случае тайлинга значениям координат конкретного UV-канала просто обрезают целую часть на уровне шейдера, если Wrap Mode текстуры установлен в Repeat.
Представьте теперь, что вы уложили текстуру в атлас (и накрыли одеялком :3). В шейдер будут приходить уже преобразованные координаты, соответствующие атласу (x * масштаб + смещение). Никакой целой части на этот раз вероятнее всего уже не будет и обрезать будет нечего, а модель залезет на чужую текстуру (одеялко оказалось маленьким). Эта проблема решается двумя способами.
Первый предполагает, что вы заранее обрежете целую часть у координат развертки. В этом случае появляется вероятность взаимоналожения полигонов, о чем мы поговорим ниже.
Второй основывается на том, что тайлинг текстур по своей сути — это метод оптимизации. Вам же никто не запрещает увеличить размер и просэмплировать нужный кусок на всю модель. Однако таким образом полезное пространство атласа будет использовано неэффективно.
Наложения в текстурной развертке — тоже чаще всего не случайны: они нужны, чтобы эффективно использовать площади текстуры. Бывает, что ошибку совершает новичок, старший товарищ это видит, произносит крепкое словцо и новичок больше так не делает. Но бывает, что наложение настолько мелкое и находится в настолько неожиданном месте, что и старший товарищ может его не заметить.
В опытном коллективе незамеченные на базовой развертке ошибки попадают в проект чуть чаще, чем никогда. Другое дело, когда меняются условия использования уже готового контента.
Пример. Мы работали с набором моделей для динамических объектов в игре. Поскольку не было задачи запечь для них свет, в UV-развертке допускались наложения.
Пример базовой UV-развертки с наложениями (показаны красным)
Однако затем мы решили не использовать эти модели как динамические, а расставлять их в качестве статичного декора на уровне. Для оптимизации, как известно, освещение статических объектов в сцене запекают в специальный атлас. Отдельного UV2-канала для карты освещения у этих моделей не было, а качество работы автоматического генератора в Unity нас не устраивало, поэтому мы решили как можно чаще использовать базовую текстурную развертку для запекания.
Здесь и возникли явные проблемы с корректностью освещения. Очевидно, что лучи, попадающие какой-нибудь статуе в глаз, не должны создавать блики на пятой точке на затылке.
Некорректно запеченное освещение модели (слева) и исправленное (справа)
Unity при формировании карты освещения в первую очередь пытается использовать UV2-канал. Если он пустой, то используется основной UV, если и этот пуст, то извините, нате вам исключение. Запечь модели в карту освещения без предварительно подготовленного UV2 в Unity можно двумя способами.
В качестве первого Unity предлагает автоматическую генерацию UV2 на основе геометрии модели. Это быстрее, чем делать вручную, к тому же данный инструмент можно настраивать с помощью нескольких параметров. Но даже несмотря на это, итоговое наложение светотени часто неудовлетворительно для высокодетализированных объектов из-за швов и затеканий в неположенных местах, к тому же упаковка частей такой развертки не самая эффективная.
Второй способ — использовать базовую UV-развертку для запекания. Очень даже привлекательный вариант, поскольку при работе с одной текстурной разверткой меньше вероятность совершить ошибку, чем при работе с двумя. По этой причине мы стараемся минимизировать количество моделей, в базовой UV которых присутствуют наложения. Созданный инструментарий помогает нам это осуществлять.
Проверка текстурной развертки на достаточность заданного пиксельного отступа при заданном разрешении текстуры — более точная валидация UV, основанная на растеризации. Подробнее об этом методе будет рассказано в следующей статье серии.
Подведем итог. Конечно, практически невозможно отследить все нюансы: иногда приходится мириться с несовершенством результата, чтобы выполнить задачу в срок. Однако выявление даже части таких недочетов позволяет ускорить разработку проекта и повысить его качество.
Секреты экспорта из Blender в Unity
— Теория о системе координат (правосторонней и левосторонней)
— Теория правильного создания 3d моделей в blender
— Быстрый экспорт файлов из Blender в Unity3d.
— Как правильно сопоставить масштабы модели в Blender и Unity.
— Экспорт с правильной ориентацией модели
— Почему количество вершин по-разному отображается в Unity и Blender?
Видео к статье
Теория о системе координат (правосторонней и левосторонней)
На самом деле это самая важная часть, я столкнулся с рядом проблем в работе физики 3d модели из-за неправильного экспорта. И так давайте сначала познакомимся с системой координат правосторонней и левосторонней.
Blender использует правостороннюю систему координат с осью Z, направленной вверх. Такую систему координат используют почти все САПР. Смотрите рисунок:
Unity3d как почти любой другой игровой движок использует левостороннюю систему координат. Когда Y направлен вверх, X — вбок, Z- вперед. Смотрим рисунок:
Теория правильного создания 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). Смотрим рисунок:
Благодаря пользователю 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.
Смотрим на рисунок:
Видем параметр 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
Ничего не было сказано, что нельзя вешать в материал текстуры (только то, что в UV-окне), иначе юнити начнет создавать папки типа object.fbm и пытаться импортировать текстуры в них независимо от того, что лежит в соседней папке Textures. Тут кроется проблема — их бесполезно удалять, при следующем переимпорте (например, при заборе репозитория в новую папку или смене целевой платформы) ассета папка появится снова. Единственное решение — правильно готовить это дело в блендере. Ну или отключать импорт материалов и настраивать префабы руками.
Да действительно в Unity 5 начали создаваться данные папки (при первичном импорте) раньше их не замечал, но они пустые и их можно удалить (они создаются только при первичном импорте) и текстуры ищет в папке Textures и применяется Шейдер в зависимости от настроек материала, если материал стандартный и то примениться Diffuse с уже настроенной текстурой, если Transperty применен в материалах, то примениться соответствующий шейдер Transperty в Unity3d и текстура тоже примениться. Сменил целевую платформу, с Web Player на Desktop — ничего не поменялось, папки не создались. Сменил на Ios — ничего не поменялось. Unity 5.0.1f1
Ничего не было сказано, что если экспортируется арматура с анимациями, то нельзя использовать FBX 7.4 BINARY формат, только старый FBX 6.1 ASCII, иначе все в юнити поедет в стиле «кровькишкирас. ».
Спасибо за дополнительную информацию, с анимацией в Blender не работал и собственно в разрабатываемом проекте не требуется костная анимация, поэтому мало знал о данном материале.
Importing Objects From SketchUp
Обзор
SketchUp is one of the commonly used software for architecture modeling. To use a SketchUp model for visualisation in Unity, user will previously need to convert it to an intermediate format which Unity supports and use the converted format in Unity.
To overcome this problem, Unity now supports importing SketchUp file directly into Unity without the need for conversion and allowing user to access certain properties within the SketchUp file within Unity which is not previously possible.
Glossary of Terms
Term | Definition |
---|---|
Node | A node is a generalisation of Entity, Group, and Component Instance in SketchUp. |
Geo Coordinate | A coordinate system to identify a position on geographic system. |
Importing SketchUp Model
Importing a SketchUp file into Unity is similar to importing a 3D model that is supported by Unity (eg FBX). There are 3 ways you can import a SketchUp file
Drag and drop the file into the Project window
‘Import New Asset…’ via Project window’s context menu
Once the model is imported, you can place then use the model in your scene by placing it into your scene. The hierarchy of the SketchUp file is maintain via Unity’s GameObject hierarchy.
Materials and Textures
When the model is imported, the materials and textures for the model are imported into 2 separate folders relative to where the file is imported to; namely ‘Material’ for the material of the model and ‘Texture’ for the textures from the model.
SketchUp Materials and Textures folders
The textures imported from the SketchUp file will maintain its original filename when it is imported into Unity.
The materials imported from the SketchUp file will have the SketchUp file name prefixed into the material’s name.
Hidden Geometries
Unity is able to determine if a node should be imported by it’s visibility setting in the SketchUp file.
If a node is set to hidden when it is last saved in the SketchUp file, Unity will not import the node.
Selective Node Import
Imagine you have a SketchUp file which contains a library of chairs and you only want to import a few of them for your scene. In this case, it is possible to only import certain objects from your SketchUp file. To do this, hold the ‘option’ key in Mac or ‘alt’ in Windows when you are importing your SketchUp file.
By doing so, a dialog box will appear for you to select what to import:
Import dialog
This dialog shows you the groups and component instances that are in the file. This also allows you to select which group or component instance to import into Unity3D.
Once you have make your selection, click on the OK button and only the nodes that are selected will be imported.
Front and Back Face
By default, Unity will only import the front facing polygons to reduce polygon counts. The exception is that if the back facing polygons have material assigned in SketchUp.
If you would like to have back facing polygons generated, you can specify this in the SketchUp Model Inspector.
Scale Conversion
Unity imports the SketchUp file and scales the model to 1 meter (0.0254 inches) to 1 unit length in Unity by default.
You can change the import scale in the SketchUp Model Inspector.
SketchUp file with a cube sert to 1m in height
Setting the conversion unit changes affects the scale of the imported file. The green square is placed as reference where the size of the square is set to 1×1 unit length.
SketchUp Component Definition, Instance and Group
Unity uses the same concept when generating meshes for SketchUp’s Component Definition, Component Instance and Group:
Component Definition and Group will be generated into meshes. The meshes will than be instanced as GameObjects so that it can be place into the scene.
SketchUp Reference
SketchUp Model Inspector
In the inspector of a imported SketchUp model, you will find several options. Any changes made in the inspector will require you to click on the ‘Apply’ button of the inspector to have the changes take effect.
SketchUp Scene Camera
Unity extracts and stores SketchUp file’s camera data for each scene in the file so that it can be used later. Refer to the API reference on how to retrieve the data.
Geo Coordinates
Unity extracts and stores the geo coordinates of the SketchUp file (if available). These values can be view via the SketchUp Model Inspector or refer to the API reference on how to retrieve the data.
Demo Package
The demo package demonstrates how to extract SketchUp scene camera and geo coordinates that was imported by Unity.