Поскольку эта статья родилась из комментария к статье "Заметки о разработке плагина для экспорта геометрии и ещё чуть-чуть" Glorg"a, пожалуйста начните чтение с оригинальной статьи , а я обойдусь без вступления:)
Вкратце, в статье пойдет речь о нюансах, с которыми вы (хотите или нет) обязательно столкнётесь при написании плагина экспорта из 3DS MAX.
Обратите внимание, как ориентированы оси системы координат в 3DS MAX, и сравните системой, используемой в DirectX.
Рисунок 1. Системы координат 3DS MAX и DirectX.
Мало того, что вверх направлена ось Z, а не Y, так в 3DS MAX еще и используется правосторонняя (right-handed), а не левосторонняя (left-handed) система координат, как в DirectX.
Если этого не учитывать, отэкспортченный персонаж в игре будет лежать на полу.
Поскольку системы разносторонние, то не существует такого поворота, с помощью которого можно перейти от одной системы к другой. Тут требуется еще и отражение относительно одной из координатных плоскостей.
Для того чтобы не путаться, проще всего при экспорте поменять местами оси Y и Z. Таким образом, если в игре персонаж должен бежать вдоль оси Z, то аниматор в 3DS MAX должен анимировать его вдоль оси Y – очень простое правило.
Для того чтобы поменять оси местами, нужно просто поменять местами компоненты Y и Z в позициях вершин и нормалях. Но при этом при экспорте анимации, каждую матрицу 3DS MAX необходимо умножить спереди и сзади на матрицу перемены осей (), чтобы вернуть позицию обратно в систему координат 3DS MAX для анимации, а потом опять в нашу систему координат.
Матрица перемены осей выглядит следующим образом:
При инвертировании, матрица не изменяется.
Полностью все выглядит так:
В документации к 3DS MAX есть раздел "Must Read Sections by Plug-In Type". Так вот, его действительно нужно прочитать! В частности, там объясняется, что такое матрица узла (node) и объекта (object).
Вся сцена в 3DS MAX представлена иерархией узлов. Когда мы создаем кубик (box) - мы создаем узел (INode) и объект (IObject), на который этот узел ссылается.
Центр локальной системы координат объекта (pivot), который мы видим в интерфейсе 3DS MAX - это визуальное представление матрицы узла. Матрицу узла можно получить методом INode->GetNodeTM().
Кроме того, объект может быть смещен относительно узла с помощью матрицы объекта. По умолчанию матрица объекта - единичная, но ее можно изменить, двигая pivot.
Рисунок 2. Включение режима преобразования pivot"а.
Когда мы двигаем pivot, 3DS MAX изменяет одновременно и матрицу узла, и матрицу объекта так, чтобы визуально геометрия оставалась на том же месте.
Полная формула преобразования геометрии в мировое пространство выглядит так:
Напрямую получить матрицу объекта невозможно. Можно получить матрицу преобразования геометрии в мировое пространство (INode->GetObjectTM()), и помножить ее справа на инвертированную матрицу узла.
Non-uniform scale(масштабирование с разными коэффициентами по осям, NUS) - это зло. Это настолько большое зло, что в ранних версиях 3DS MAX при включении этого режима выскакивало предупреждение. Но в последний версиях 3DS MAX его убрали (наверное потому, что художники его все равно не читали:).
NUS рождает две следующие проблемы:
1. Для преобразования нормалей необходимо использовать inverse transpose матрицу.
Обычно, в играх для преобразования нормалей используется та же матрица, что и для преобразования позиций, только с обнуленным смещением. В случае с NUS это не работает:
Рисунок 3. Если для преобразования нормалей использовать ту же матрицу, что и для позиций, нормали больше не перпендикулярны поверхности.
Если для преобразования позиций используется матрица M, то для преобразования нормалей необходимо использовать . Впрочем, можно просто считать нормали уже после преобразования позиций.
Обычно проблему NUS можно решить путем выделения из матриц масштабирования, и применения его к координатам вершин (таким образом удается избавиться от масштабирования вообще). К сожалению, это не избавляет от второй, фундаментальной проблемы.
2. Если к кости применен NUS, то при вращении она сжимается.
Вообще-то, до того, как модель дошла до стадии экспорта, проблемы уже должны были возникнуть у аниматоров, и они обязаны были вернуть модель назад моделеру:).
Поскольку в матрице узла содержится неравномерное масштабирование, то при вращении кости она описывает эллипс, а не круг. Поскольку в играх анимация кости сохраняется только в виде положения и вращения (кватернионы), то анимация в игре не будет соответствовать анимации в 3DS MAX.
Другими словами, NUS - это зло, и ваши художники должны следить, чтобы матрицы узлов не содержали его. Если нужно выполнить неравномерное сжатие, его нужно выполнять над вершинами геометрии (vertices sub-object), а не над узлом.
Матрицы также могут содержать искривление осей (переход к неортогональной системе координат). К счастью, добиться этого стандартными методами 3DS MAX очень сложно, поэтому такие случаи редки (используйте метод Matrix3->Orthogonalize()).
3DS MAX позволяет указывать отрицательное масштабирование.
Рисунок 4. Отрицательное масштабирование.
Эффективно это масштабирование+отражение по одной из осей. Если объект отражен или отмасштабирован с отрицательным коэффициентом, то нужно поменять порядок следования вершин в треугольнике (отразить нормаль). Проверить это можно, проанализировав матрицу:
bool RF2_Export_FaceNeedFlip(INode *Node, float time) { Matrix3 m = (Node->GetObjectTM (time)); return (DotProd(CrossProd(m.GetRow(0),m.GetRow(1)),m.GetRow(2))<0.0)?1:0; };
Иногда проблемы возникают из-за незнания интерфейса 3DS MAX. На самом деле, вы - программист, и знать 3DS Max не обязаны, но все же...
3DS MAX позволяет прятать (hide) объекты. Это очень полезная функция, и художники часто этим пользуются. Чтобы у вас не возникало проблемы, когда в отэкспорченной сцене появляются какие-то непонятные объекты, которых в 3DS MAX вроде бы нет, вам нужно знать, что 3DS MAX позволяет спрятать объекты тремя разными способами.
1. Спрятать выделенные объекты с помощью контекстного меню:
Рисунок 5. Контекстное меню (вызывается правой кнопкой мыши).
Для того, чтобы показать все объекты сцены, спрятанные этим способом, нужно выбрать в том же меню "Unhide all".
2. С помощью слоев:
Рисунок 6. Окно Layer Manager (вызывается Tools->Layer Manager).
3. С помощью панели Display:
Рисунок 7. Панель Display options.
Объект, спрятанный любым способом, не будет отображаться в окнах ViewPort и в списке объектов. Сам плагин не различает способа скрытия; в нем можно использовать единый метод INode->IsHidden().
Рисунок 8. Панель face sub-object.
Кроме целых объектов, 3DS MAX позволяет скрывать отдельные треугольники. Плагин может запросить статус треугольника методом Face->Hidden().
Экспорт из 3ds max возможен в самые различные форматы. Самые популярные - 3ds, obj, stl и др. Сегодня мы рассмотрим сохранение файла сцены или 3d-модели в такой популярный старый формат, как 3ds.
Этот формат на сегодняшний день считается устаревшим и зародился он еще в такой древней программе, как «3d studio», которая работала еще на DOS. Сейчас такой формат если используется, то только для переноса из одного редактора 3d-графики в другой, либо для сохранения модели и размещения в библиотеках, чтобы пользователи могли использовать их, если не могут открыть файл своей версией редактора. В общем, как альтернатива.
ВАЖНО! Основной минус данного формата в том, что он имеет некоторые ограничения по количеству полигонов, поэтому относительно сложные сцены и объекты в нем сохранить не получится. Для этого лучше подойдет формат с расширением obj.
Если вам требуется экспортировать 3d-модель из программы 3ds max в формат 3ds, то для этого необходимо проделать следующие простые действия.
Для начала открываем меню вверху слева и наводим курсор мыши на слово Export.
Теперь, если у вас появилось окошко, как на скриншоте ниже, то снова нажимаем на Export.
После нажатия перед нами появится окошко с открытой папкой с одноименным названием, которая находится по адресу C:\Users\название вашего компьютера\Documents\3dsMax\export, или проще: Мои документы — 3dsMax — export.
Здесь мы даем имя нашему файлу, желательно английскими буквами, т.к. 3ds max не очень любит кириллицу. Теперь выбираем формат (расширение 3DS), как показано на рис.выше. Далее жмем Save и файл сохранится в папке export. Вы можете выбрать любую папку для сохранения, например Desktop (рабочий стол). Открывается файл 3ds обычно через команду Import почти во всех редакторах 3d-графики. С помощью команды Open вы его не откроете, т.к. Open открывает только родные файлы, например, 3ds max открывает этой командой только свои типы файлов с расширением max.
Редактор 3ds Max позволяет осуществлять Import (Импорт) и Export (Экспорт) файлов и объектов. Это дает возможность оениваться геометрическими формами с другими программами, такими как Adobe Photoshop , Adobe Illustrator , AutoCAD и т.д.
При экспортировании файлов программа преобразует сцены с расширением.max в универсальные форматы.3ds или.dwf. Так как данные форматы менее восприимчивы к преобразовию, то часть информации о сцене при преобразовании может измениться либо исчезнуть. Редактор 3ds Max 2013 предупреает об этом при преобразовании. Также он предлагает сохрить координаты текстур.
Для экспортирования файла необходимо выбрать команду Ap- plication button (Кнопка приложения) | Export (Экспорт) и в поившемся диалоговом окне Select File to Export (Выбрать экортируемый файл) выбрать директорию для сохранения, укать тип и имя файла (рис. 4.21).
Рис. 4.21. Экспортирование файла
Рис. 4.22. Импортирование файла
Для импортирования файла следует нажать кнопку приложия и выбрать команду Import (Импорт) . В открывшемся диалоговом окне Select File to Import (Выбрать импортируемый файл) необходимо выбрать формат импортируемого файла и нужный файл, а затем открыть его (см. рис. 4.22). В зависимости от формата импортируемого файла 3ds Max может предложить различные варианты внесения компонентов.
В 3ds Max 2013 имеются широкие возможности импорта. Блодаря технологии Smart Data стал возможен перенос моделей из редактора Autodesk Inventor . При импорте файлов с расширении.iam и.ipt можно выбирать способ импорта (тело или сетоый объект), переносить материалы и источники света, что пволяет получать высококачественные модели без дополнителых манипуляций (рис. 4.23).
Рис. 4.23. Модель крана из Autodesk Inventor
Важной особенностью функций импорта является поддержка 3D-моделей сервиса Google SketchUp (рис. 4.24). Этот сервис пволяет бесплатно скачивать модели реальных архитектурных зданий, интерьеров помещений и отдельных предметов. Диалогое окно импорта позволяет переносить в сцену не только саму модель, но и сопутствующие текстуры (с поддержкой преобразания внешних/внутренних текстур в двухсторонние материалы 3ds Max), камеры и системы освещения (рис. 4.25).
Рис. 4.24. Страница сервиса Google SketchUp
Рис. 4.25. Модель церкви Santa Maria del Pulg в 3ds Max 2013
Еще одной важной особенностью 3ds Max является поддержка функций сохранения в формате предыдущих версии 3ds Max без потери данных сцены. Благодаря этому стал доступен поступа-
тельный переход от одной версии к другой при работе над болими проектами, что особенно важно для дизайн-студий.
Источник: Харьковский, Александр Викторович, 3ds Max 2013. Лучший самоучитель / А.В. Харьковский. - изд. 4-е, доп. и перераб. - Москва: Астрель, 2013. - 480 с. - (Учебный курс).
Цикл статей „Создание интерьера в 3ds Max “ посвящен созданию проекта бутика. В данном случае у нас имеется чертеж , выполненный в AutoCAD , который мы хотим использовать в работе в 3ds Max.
Но прежде, чем ипортировать чертеж, мы немного его доработаем.
Для нашей работы в 3ds MAX важно, чтобы все линии контуров стен были замкнутые и нигде не пересекались. Поэтому, прежде чем заняться импортом чертежа , обведем контуры стен, создав при этом единую замкнутую полилинию . Полилиния - совокупность отрезков, которые представляют собой единый цельный объект
В новом слое Walls (стены), используя команду pline (полилиния) обведем стены с внутренней стороны помещения, не забывая размещать вершины, там, где должны быть двери. Чтобы замкнуть полилинию, в коммандной строке вводим close. Затем обведем стены с наружной стороны. Внутри помещения будет перегородка, ее так же обводим. Объекты, которые раньше составляли стены, перегородки, удаляем.
File (верхняя левая кнопка) → Import → Import . Выбираем чертеж в формате.dwg.
Настройки в появившемся окне:
Для наглядности перейдем в окно Perspective: с помощью ПРАВОЙ кнопкой мыши выбираем окно Perspective, нажимаем клавиши Alt + W.
С помощью инструмента Select by name, выбираем все элементы, которые не относятся к Layer:Walls и к Layer:0 → ok → del.
Сохраним документ: File → Save as.
Выбираем слой с мебелью (л. кн. мыши). Переходим на вкладку Modify (модифицировать). Вместо надписи Layer:0 указываем новое имя слоя Layer:Furniture в верхней строке вкладки Modify.
Кнопка Snaps toggle в верхней панели инструментов должна быть нажата. Вызываем окно с настройками привязок нажатием правой кнопкой мыши по этой кнопке. Ставим галочки у следующих привязок: grid points, vertex, midpoint.
Pivot - опорная точка 3d объекта, точка, являющаяся центром поворота и масштабирования объекта. Чтобы изменить положение Pivot у стен, левой кнопкой мыши выбираем стены. Во вкладке Hieararchy (иерархия) → кнопка Pivot → в свитке Adjust pivot нажать кнопку Affect pivot only (влиять только на опорную точку) → кнопка center to object (установить pivot в центр объекта). Важно затем отпустить кнопку кнопку Affect pivot only!
То же самое выполняем для слоя с мебелью.
Л. кн. мыши выбираем слой со стенами. Пр. кн. мыши по кнопке Select and Move вызываем окно Move Transform Type - In. Значения координат по всем осям устанавливаем на ноль.
Стены переместятся в начало координат программы (исчезнут из поля зрения). Тоже самое проделаем с мебелью. Чтобы увидеть наш чертеж, нажимаем горячую клавишу Z (исходное положение объекта). Теперь чертеж лежит на сетке, которая находится в центре системы.
Слой furniture немного переместим по оси X, чтобы мебель не выходила за границы стен. Выключим привязки (они будут мешать в этом случае). Выделяем мебель → нажимаем кнопку Select and Move → наводим мышкой на ось X, так чтобы только эта ось горела желтым → тянем, удерживая нажатой левую кнопку мыши, до тех пор, пока мебель не окажется в пределах стен.
Вызываем окно Grid and Snap Settings (пр. кн. мыши по кнопке Snaps Toggle). Во вкладке Home Grid следующие параметры: Grid Spacing - шаг сетки; Major Lines every Nith Grid Spacing" регулирует, через сколько квадратиков в сетке будут проходить жирные линии; Perspective View Grid Extent - величина сетки, отображаемой в окне перспективы, а именно, сколько будет отображено ячеек от центрального перекрестья сетки в каждом направлении.
При отдалении от объекта шаг сетки увеличивается, при приближении к объекту шаг сетки уменьшается до минимального.
Manage layers → Слой furniture прячем (лампочка у Hide).
В следующей статье мы продолжим работу над проектом.