Импорт Maya ASCII в игру - PullRequest
3 голосов
/ 21 июля 2009

В настоящее время я работаю над созданием конвейера на основе импорта для моей инди-игры, используя Maya ASCII .ma в качестве исходного формата и мой собственный формат для физики и графики в качестве выходных данных. Я сохраню такие вещи, как атрибуты диапазона движения внутри Maya, например, для шарнирного соединения. Другие типы параметров, которые требуют большого количества настроек, заканчиваются в отдельных исходных файлах (возможно, .ini для таких вещей, как масса, константы пружины, сила физических движков и тому подобное).

Таким образом, входными данными являются один файл .ma и один .ini, а выходными данными являются, помимо прочего, один файл .physics и несколько файлов .mesh (один файл .mesh на геометрию / материал).

Я также, вероятно, собираюсь использовать Python 3.1 для переформатирования данных, и я уже нашел некоторый код LGPL 2.1, который читает базовый Maya ASCII. Я, вероятно, также буду использовать Python для запуска платформы во время разработки. Игра разработана на C ++.

Есть ли во всем этом что-то, против чего вы бы посоветовали? Краткое описание вещей, которые могут быть ошибочными:

  • Конвейер на основе импорта (не на основе экспорта)?
  • Майя (не 3DS)?
  • Maya ASCII .ma (не .mb)?
  • .ini (не .xml)?
  • Разделение атрибутов движения в майя и атрибутов "странный твик" в .ini (не все в майя)?
  • Python 3.1 для построения данных (не встроенный C ++)?

Редактировать: если у вас есть лучшее предложение о том, как реализовать цепочку инструментов импорта / экспорта физики / графики, я был бы благодарен за ввод.

Ответы [ 3 ]

4 голосов
/ 01 декабря 2009

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

  • Maya .ma (по крайней мере, до текущего v.2010) создается mel. Мел завершен по Тьюрингу, но то, как иерархическая сцена описывается в терминах узлов, намного проще, чем «код».
  • Добавьте обработку ошибок раньше, или вы пожалеете позже.
  • Вы должны обрабатывать множество различных узлов, где преобразования являются самыми отвратительными. Другие типы включают сетки, материалы (много разных типов), «движки шейдеров» и файлы (такие как текстуры).
  • .ma описывает только формы и настройки; но очень редко определяет необработанные вершины. Я решил сохранить небольшой скрипт «export» внутри .ma, чтобы избежать генерации всех примитивов точно так же, как в Maya. Оглядываясь назад, это был правильный путь. В противном случае вы должны быть в состоянии сделать что-то вроде
    1. «Создай сферу»,
    2. «Переместить мягкое выделение с радиусом туда-сюда отсюда»,
    3. «Переместить вершину 252 единицы xyz» (со всеми неявно определенными вершинами).
  • Майя определяет полигоны для ячеек; вы можете захотеть к треугольникам.
  • Все параметры, которые существуют в определенном типе узла, определены явно или неявно. Вы должны знать их значения по умолчанию (если они неявно определены),
  • По сути, объект определяется преобразованием, сеткой и примитивом. Преобразование является родителем меша. Преобразование содержит масштабирование, вращение, перевод, поворотные переводы и некоторые другие. Сетка связывается с примитивом и наоборот. Примитив имеет тип («polyCube») и размеры («ширина, высота, глубина»).
  • Узлы могут иметь «множественное наследование». Например, созданная несколько раз сетка имеет одну сетку (и один примитив), но несколько родителей (преобразования).
  • Преобразования узла вычисляются следующим образом (для получения дополнительной информации см. Maya xform doc ):

vrt = getattr("rpt")
rt = mat4.translation(vrt)
...
m = t * rt * rpi * r * ar * rp * st * spi * sh * s * sp
  • Я строю свой движок на основе физики, поэтому игровой движок хочет, чтобы сетки размещались на физических фигурах, но при моделировании я хочу это наоборот. Это сделано для того, чтобы оно было общим для будущих приложений («сетки без физики»). Это крошечное решение вызвало у меня серьезное горе в трансформациях. Линейная алгебра поправилась. Проблемы масштабирования, вращения, перемещения и сдвига; Вы называете это, у меня было это.
  • Я построил свой инструмент импорта на парсере Maya cgkit . Спасибо Матиасу Баасу!
  • Если вы собираетесь сделать что-то подобное, я настоятельно рекомендую вам заглянуть в мой конвертер , прежде чем писать свой собственный. Этот «маленький» проект занял у меня три мучительных месяца, чтобы прийти в основное рабочее состояние.
1 голос
/ 24 декабря 2009

Вам следует рассмотреть возможность использования конвейера на основе экспорта или стандартизированного формата файла, такого как OBJ или COLLADA, вместо повторной реализации парсера .ma и репликации всех внутренних объектов Maya, необходимых для его интерпретации.

Формат .ma / .mb не предназначен для чтения какой-либо программой, кроме самой Maya, поэтому Autodesk не прикладывает никаких усилий для упрощения этого процесса. Для правильного разбора на 100% вам потребуется реализовать весь язык сценариев MEL.

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

Обратите внимание, что Maya можно запустить в режиме "без головы", когда она загружает сцену, выполняет сценарий MEL и существует без загрузки графического интерфейса. Таким образом, нет проблем с его использованием в автоматизированных системах сборки.

1 голос
/ 21 июля 2009

Как общий формат сериализации, который удобен для чтения и написания человеком, имеет отличную поддержку Python (и, на самом деле, поддержку любого языка ), вы можете рассмотреть возможность использования YAML или JSON поверх INI-файлов или XML.

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

Одним из преимуществ JSON и YAML является типизация: оба формата анализируются по спискам Python, словарям, числам с плавающей запятой, целым числам ... В основном: нормальные типы Python.

Кроме того, если вы не уверены, что каждая библиотека, которую вы когда-либо будете использовать, работает на 3.1, возможно, вы захотите немного придерживаться версии 2.x из-за проблем с доступностью библиотеки.

...