Уголок tool-программСтатьи

Создание плагина экспорта анимации для 3dsMax

Автор:

Введение
Создание анимации в МАХе
Подготовка к созданию плагина
Создание плагина

Введение

В этой статье я расскажу вам как правильно создать плагин к 3ds-Max (в дальнейшем MAX) для экспорта keyframe-анимации. Keyframe Morphing используется в основном для небольших аркад и стратегий, где используются в основном Low-poly модели.

Плюсы Keyframe Morphing’а:
•  Очень прост в использовании.
•  Не требует дополнительных данных (кости, джойнты, и.т.п.)
•  Быстрый просчет (использует минимум мат. операций)

Минусы Keyframe Morphing’а:
•  Не позволяет использовать Rag Doll’ы.
•  Занимает слишком много памяти при достаточно большом наборе анимаций.
•  Совершенно не подходит для High-poly и Middle-poly.

Теперь приступим к созданию плагина для MAXа.

Создание анимации в МАХе

Проанимировать модель можно любым модификатором, это никак не повлияет на экспорт. Для удобства можно использовать Бипед.

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

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

Далее для _BASE_-сетки мы расставляем ключевые кадры на трэк-баре. Для более гладкой анимации нужно расставить на каждый юнит времени по ключевому кадру. Чем больше шаг между ключевыми кадрами, тем меньше весит файл анимации, и тем менее качественная анимация.

zz | Создание плагина экспорта анимации для 3dsMax

Для удобства можно ввести коэффициент компрессии анимации в плагине. Чем выше компрессия, тем больше шаг между ключевыми кадрами. Но это нюансы.

Подготовка к созданию плагина

Для начала определимся с количеством анимаций. Я ограничился шестью анимациями. Для простоты понимания, я рассматриваю частный случай, но можно сделать неограниченное количество анимаций.

Теперь определимся с понятиями:

Ключевой кадр (кейфрейм) – это набор вершин в определенный момент времени в сцене.
Анимация – это именованный набор ключевых кадров с N-кадра до M-кадра.
Набор анимаций (сет) – это набор анимаций, которыми обладает 3D-модель.

Как мы будем хранить данные в файле:

Сначала записываем количество ключевых кадров (int).

Далее записываем кейфреймы:
•  Время кейфрейма в локальной системе отсчета времени (int).
•  Материал: данные о текстуре.
•  Геометрия: вершины, нормали, фэйсы.

Далее количество анимаций в нашем сете (int).

Далее записываем анимации:
•  Имя анимации (char*).
•  С какого кейфрейма начинается анимация (int).
•  По какой кейфрейм длится анимация (int).

Вот и всё. Причем все данные записываем в бинарный файл (для безопасного хранения).

Создание плагина

1. Работа с MaxApi

Вкратце опишу те функции, с которыми нам придется работать.

Node->GetName() – возвращает нам имя узла (char*). Это нам нужно для того чтобы найти узел _BASE_. Еще нам нужно проверить нет ли дубликата имени _BASE_.

Приведу код:

bool  bBaseFinded; // Найден ли _BASE_
std::string s1, s2;

s1 = Node->GetName(); // Получаем имя
s2 = "_BASE_";

if(s1 != s2) return TREE_CONTINUE; // Следующий узел
else
{
  if(!bBaseFinded) bBaseFinded = TRUE;
  else return TREE_ABORT; // Найден дубликат
}

Interface->SelectNode(Node) – выбирает узел Node. Эта функция нам нужна, для того чтобы трек-бар получил значения для Node, т.к. трек-бар получает (отображает) значения того узла, который выделен в данный момент.

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

Приведу код:

Int Time = 0;

// Получаем трек-бар в текущем состоянии.
ITrackBar* TrackBar =  Interface ->GetTrackBar();

int AllKeyframes = 0;

// Пробегаемся по всему трек-бару, пока не достигнут его конец,
// и приращаем значение на 1.
do
{
  Time = TrackBar->GetNextKey(Time, TRUE); //  Берем время следующего кейфрейма
  AllKeyframes++;
} while(Time); // Пока мы не вернулись в начало (к первому кейфрейму)

Опишу несколько функций, с помощью которых мы получим данные нужного нам кейфрейма.

Node->EvalWorldState(Time).obj – возвращает объект узла (Time – время текущего кейфрейма).

Незабудте помножить вершину на матрицу смены осей (т.к. MAX и DX (OGL) используют разные с.к.):
Matrix3 ZYMatrix(Point3(1,0,0),Point3(0,0,1),Point3(0,1,0),Point3(0,0,0));

Node->GetObjTMAfterWSM(Time) – возвращает матрицу, на которую нужно помножить каждую вершину (Time – время текущего кейфрейма).

Далее нужно получить вершину, нормаль, фэйс и материал. Нужные функции вы можете найти в MaxSdk-Help’е. Это не составит сложностей.

2. Работа с WinApi (создание окна параметров)

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

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

Слот – это 3-и Edit Box’а и Check Box:
•  Имя анимации
•  С какого кейфрейма
•  По какой кейфрейм
•  Активен ли слот

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

xdxxx | Создание плагина экспорта анимации для 3dsMax

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

Далее создаем обработчик событий окна. Это не составит трудностей, т.к. требуется только знание азов WinApi.

При экспорте данные об анимациях мы будем брать из этих слотов.

На этом создание плагина можно считать законченным.

3. Что еще можно прикрутить

Моделерам всегда хочется знать, сколько полигонов содержит модель, причем не лесть в разные окна. Для этого можно сделать возможность отображения количества полигонов, вершин, и материалов прямо в окне параметров плагина.

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

Пробег по дереву сцены будет осуществляться, используя один из двух режимов:
•  Пассивный – мы берем лишь данные (только чтение).
•  Активный – чтение и запись в файл.

Запускаем пассивный режим, получаем данные об объекте.
Далее присваиваем нужным контролам в окне параметров эти данные.
После того, как кнопка OK в окне параметров была нажата, запускаем активный режим.
Далее завершаем работу плагина.

Компрессия:

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

Вводим эдитбокс типа int. Это будет значение коэффициента компрессии. Т.е. какое значение, столько и будем пропускать кейфреймов через один.

Стоит ограничить коэффициент компрессии значением 5 или 10.

Еще стоит автоматизировать расстановку кейфреймов. Т.е. сначала исчем _BASE_, далее выделяем его, далее расставляем через нулевой шаг все кейфреймы на трек-баре.

Это придаст очень большое удобство плагину.

Вот и всё. На этом я закончу свою статью.

#3D Studio MAX, #плагины, #анимация, #экспорт, #экспорт анимации

6 июня 2006 (Обновление: 17 июня 2006)

Комментарии [2]