Войти
ПрограммированиеСтатьиГрафика

Скелетная анимация и экспорт из Maya 4.0. (2 стр)

Автор:

Экспорт данных из Maya

Plug-in строится на основе класса, порожденного от одного из классов Maya SDK. Это может быть класс трансляторов (экспорт/импорт), класс команда (добавить свою команду в MEL), класс подчинённых узлов - "dependency node" (всевозможные шейдеры, процедурные текстуры, примитивы). Нам необходим экспорт, поэтому будем использовать класс MPxFileTranslator.

Оформляется plug-in как стандартный DLL-файл, но с расширением mll.

Вот пример класса экспорта (что именно он экспортит - не важно)

class MAnimationExport : public MPxFileTranslator
{
public:
  // конструктор и деструктор
                   MAnimationExport() {};
  virtual          ~MAnimationExport() {};

  // эта функция перегружаема для Maya
  // после загрузки plug-in'а Maya вызовет ее для создания
  // объекта plug-in'а. Эта функция необходима для всех вариаций
  // plug-in'ов под Maya
  static  void     *creator();
  
  // для файловых трансляторов необходимы методы чтения и записи,
  // однако импорт нам не нужен, поэтому объявляем только экспорт
          MStatus  writer(const MFileObject& file, const MString& optionsString,
                          MPxFileTranslator::FileAccessMode mode);

  // следующие функции выполняют роль флагов для Maya
  // их стоит переопределить под свой транслятор

          bool     haveReadMethod()	const {return false;} // нет метода для импорта
          bool     haveWriteMethod() const {return true;} // есть метод для экспорта
          bool     canBeOpened() const {return false;}    // можно ли открыть файл

  // расширение наших файлов по умолчанию
  // в принципе сюда можно написать что-угодно, а потом при создании файлов
  // делать свое расширение, как это в сделано примере
          MString  defaultExtension() const {return "anm";}

  // определить, что транслятор файлов может работать с файлами данного типа
  // по-моему этот метод необходим только если есть импорт
  // но на всякий случай оставляю

          MFileKind identifyFile(const MFileObject& fileName, const char *buffer,
                                 short size) const;
};

Итак, необходимо определить 3 функции: creator, writer  identifyFile.

Простейшая функция :) - создать объект этого же класса и вернуть указатель на него

void* MAnimationExport::creator()
{
	return new MAnimationExport;
}

Запись данных в файл тоже не немного сложнее

MStatus MAnimationExport::writer(const MFileObject& file, const MString&
                           optionsString, MPxFileTranslator::FileAccessMode mode)
{
  // для начала сделаем имя файла (а можно воспользоваться тем,
  // которое предлагает Maya)

  // получить имя файла
  MString fileName = file.fullName();
	
  // отбрасываем все символы после первой точки в имени файла
  int iExt = fileName.rindex('.');
  while(iExt != -1)
  {
    fileName = fileName.substring(0, iExt-1);
    iExt = fileName.rindex('.');
  }

  // новое имя файла должно иметь расширение .anm
  MString anmName = fileName + ".anm";

  // а вот следующие две функции необходимо писать самому
  // первая функция необходима для сбора данных
  // вторая функция выполняет запись
  // их можно оформить как угодно - добавить в класс или
  // сделать отдельными функциями. У меня они отдельные


  // собрать анимационный трек
  Animation* animation = collectAnimationTrack();
  // записать анимационный трек
  writeAnimation(anmName.asChar(), animation);

  // все

  return MS::kSuccess;
}

Для определения типа файла используется проверка идентификационной строки. Если она меньше или не совпадает возвращается константа Maya MPxFileTranslator::kNotMyFileType. В противному случае говорим, что наш файл-транслятор знает как работать с этим типом файла - константа Maya MPxFileTranslator::kIsMyFileType

MPxFileTranslator::MFileKind MAnimationExport::identifyFile(const MFileObject& fileName, 
                                               const char *buffer, short size) const
{
	MFileKind rval = kNotMyFileType;
	if(((short)animIdentify.length() <= size) &&
		(strncmp(buffer,animIdentify.asChar(), animIdentify.length()) == 0))
		rval = kIsMyFileType;
	return rval;
}

Хорошо, plug-in есть, но его надо загрузить. Для этого необходимы две экспортируемые функции - для инициализации и удаления plug-in'а. Обе эти функции вызываются Maya.

Инициализация

MStatus __declspec(dllexport) initializePlugin(MObject obj) 
{
  MStatus stat = MS::kSuccess;

  // определяем наш plug-in

  MFnPlugin plugin(obj, "Animation Export Demo", "1.0.0.1", "Any");
  // и пытаемся его зарегистрировать как транслятор файлов
  stat = plugin.registerFileTranslator("AnimationExport", "Animation.rgb",
                                         MAnimationExport::creator, "", "", true);
  if(!stat)
  {
    MGlobal::displayError("registerFileTranslator - Animation Export");
    return stat;
  }

  return MS::kSuccess;
}

Удаление plug-in'а

MStatus __declspec(dllexport) uninitializePlugin(MObject obj) 
{
  MStatus         status;
  // определяем некоторый объект как plug-in (он передается Maya)
  MFnPlugin       plugin(obj);

  // пытаемся удалить транслятор файлов с именем AnimationExport
  status = plugin.deregisterFileTranslator("AnimationExport");
  if(!status)
  {
    MGlobal::displayError("deregisterFileTranslator - AnimationExport");
    return status;
  }

  return MS::kSuccess;
}

Страницы: 1 2 3 4 Следующая »

#Maya, #анимация, #скелетная анимация, #экспорт

6 марта 2003 (Обновление: 23 сен. 2009)

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