Уроки Коммент.

Создание игр » Новости » Экспорт из 3d max за 5 минут – max script

Экспорт из 3d max за 5 минут – max script

3d max - maxscriptЭкспорт из 3d max многим почему-то кажется очень сложной задачей. Я не раз уже видел на разных форумах ситуацию когда люди, ради того, что бы самим не делать экспорт из 3d max, начинали разбираться в каких-то сторонних форматах вроде .obj или .3ds, погружались в их загрузку, работу с ними и в итоге, обычно, это выливалось в просто копи-паст чужого кода, без понимания происходящего. Мне лично этот вариант решения проблемы кажется ошибочным – ничего не мешает Вам использовать любой подходящий формат, но Вы в любом случае должны знать и понимать как и что происходит в вашем движке и игре. А потому лучше бы написать хотя бы разок свой собственный экспорт из 3d max, и потом свой импортер (загрузчик) этих данных в движок – просто ради понимания того, как обычно это происходит. В этом уроке я покажу вам крайне простой способ создания экспортера из 3d max в обычный текстовый файл с использованием maxscript.

МaxScript, как и большинство скриптовых языков, имеет очень простую структуру и легко изучается за один вечер. Только, пожалуйста, не думайте, что я сейчас буду вас грузить всеми тонкостями maxscript’а – нам ведь и без того есть чем заняться. Если Вы захотите немного подучить maxscript – просто откройте MaxScript Help, который идёт в комплекте с самим 3d Studio MAX и почитайте его – там очень много примеров и очень хорошо объяснено, где, когда, для чего и как использовать maxscript для решения повседневных задач в 3D Max.

Я же дам Вам лишь сам script на maxscript ))) и дам некоторые пояснения о том, как и что в нём работает. Итак, код:

out_name = getSaveFileName caption:"Export to Text File"\
	types:"Text Files(*.txt)|*.txt"\
	initialDir:(getDir #export)\
	historyCategory:"ExportTextFiles"
if out_name != undefined then 
(
	tmesh = snapshotAsMesh selection[1]
	out_file = createfile out_name
	num_verts = tmesh.numverts 
	num_tverts = tmesh.numtverts 
	num_faces = tmesh.numfaces
	format "% % %\n" num_verts num_faces num_tverts to:out_file
 
	for v = 1 to num_verts do
	(
		vert = getVert tmesh v
		format "%\t%\t%\t\t" vert.x vert.y vert.z to:out_file
		normal = getNormal  tmesh v
		format "%\t%\t%\n" normal.x normal.y normal.z to:out_file
	)
	format "\n" to:out_file
 
	for v = 1 to num_tverts do
	(
		vert = getTVert tmesh v
		format "% % %\n" vert.x vert.y vert.z to:out_file
	)
 
	format "\n" to:out_file
	for f = 1 to num_faces do
	(
		face = getFace tmesh f
		format "%\t%\t%\t\t" (face.x as Integer) \
			(face.y as Integer) \
			(face.z as Integer) to:out_file
		face = getTVFace tmesh f
		format "%\t%\t%\n" (face.x as Integer) \
			(face.y as Integer) \
			(face.z as Integer) to:out_file
	)
	close out_file
	delete tmesh
)

Я исходил здесь из того, что мы экспортируем модель, на которой есть текстурная развёртка. Рассмотрим немного более детально, что именно делает этот код:

out_name = getSaveFileName caption:"Export to Text File"\
	types:"Text Files(*.txt)|*.txt"\
	initialDir:(getDir #export)\
	historyCategory:"ExportTextFiles"

Открываем диалог записи файла, в который пользователь хочет сделать экспорт – эту возможность (открытия диалога) предоставляет нам сам 3d max. historyCategory:”ExportTextFiles” указывает отдельную категорию – указав её, мы обеспечим то, что при следующем открытии этого диалога 3d max “вспомнит” в какую директорию мы сохраняли файл в последний раз и сам откроет её по-умолчанию.

Если файл был выбран пользователем, то мы создаём файл, в который будет идти экспорт данных из 3d max, получаем сохраняемый объект (имя является первый из выбранных в 3д max объектов и наш export’ер экспортит только один объект) и записываем количество вертексов, текстурных вертексов (они в 3d Studio MAX хранятся отдельно) и количество фейсов (граней):

tmesh = snapshotAsMesh selection[1]
out_file = createfile out_name
num_verts = tmesh.numverts 
num_faces = tmesh.numfaces
format "% %\n" num_verts num_faces to:out_file

Далее мы поочерёдно экспортим в файл:

  1. Вертексы объекта + нормали
  2. Текстурные вертексы (снова – да-да, они хранятся в 3d max отдельно и получать их надо отдельно)
  3. Грани (по 3 индекса на грань) и текстурные грани (они тоже отделены от обычных граней)

После этого закрываем файл, удаляем снапшот меша:

close out_file
delete tmesh

Экспортер готов к использованию. Попробуйте запустить его, экспортировать что-нибудь и проверьте содержимое полученного файла. Если Вы не знаете где это в максе находится, то: боковая панель, последняя закладка, кнопочка Max Script, Run Script.

Вы же потратили не больше 5 минут, что бы понять как и что работает, правда же? Теперь у нас есть работающий экспорт-скрипт для 3d max!

Ещё по этой теме:




Раздел: Новости

12 комментариев на "Экспорт из 3d max за 5 минут – max script"
  1. Antony пишет:

    Сайт очень нужный и очень классный. Спасибо за него!

    Присоединяюсь к пожеланиям, был бы очень рад увидеть статьи и о 3d, об анимации и т.д.

    1. L-ee-X пишет:

      Не то слово )) Сайт очень хороший… Ждем с нетерпением уроков по 3D…

  2. Вячеслав пишет:

    Antony, L-ee-X, спасибо за что читаете и комментируете!
    Уроки о 3d уже пишу – первые из них будут на сайте в самые ближайшие дни.

  3. gms пишет:

    Очень интересно читать, спасибо за уроки. Хотелось бы еще почитать про GUI.

  4. Вячеслав пишет:

    gms, gui 3d max? или его создание на maxscript? или на 3d max sdk? или просто создание gui для игр/под DirectX?

    1. gms пишет:

      Просто для игры под DX

      1. Вячеслав пишет:

        Ок, понял. Уроки по этой теме скоро будут. Думаю, примерно через дней 5-7 доберёмся до них )

  5. Alexander Brin пишет:

    Maya + Python будут?

    1. Вячеслав пишет:

      Нет, не будут.

  6. Everard пишет:

    Хорошая статья. То, что нужно для начала. Но наиболее интересен вопрос про экспорт tangent и binormal. Помнится, в max sdk + IGame была возможность получать их из меша такими, какие они были в 3DS MAX (т.е. расчет их производился точно так же, как и в самом 3DS, т.к. библиотеку эту писали сами разрабы макса). Внимание, вопрос! Появилась ли в новых максах возможность экспортить эти самые tangent и binormal с помощью max script без расчета вручную (т.е. напрямую из меша). Ведь задача расчета TBN нетривиальна, там нужно учитывать smooth groups, текстурные координаты (которых может быть более одного набора).

    Кстати, чтобы сократить время загрузки данных из файла можно было бы экспортить уже собранные вершины, т.е. не отдельно координаты, нормали, текстурные координаты, тангенты, бинормали (если базис TBN не ортонормированный), а все вместе. В итоге, количество вершин в полученном меше скорее всего возрастет (простой пример – у куба 8 вершин, у текстурированного куба, чтобы на каждой грани была наклеена текстура при кубическом текстурировании (не помню как это правильно назвать) – 24 вершины. Если сюда добавить еще дополнительные текстурные координаты, то количество вершин вновь возрастет (это же случится при добавлении tangent и binormal).

    Просто про то, о чем я только что написал особо не распространяются, хотя это, собственно, и является реальным препроцесингом модели, чтобы ее можно было максимально быстро загрузить в графическом движке.
    Няяя =)

    1. Вячеслав пишет:

      Everard, спасибо за отзыв. Экспорт через макс-скрипт был временным решением, я просто показал как это сделать можно – знать макс-скрипт и работать с ним надо, потому что это всегда может пригодиться. А в следующей статье описано, как делать лучше и более качественно )

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

      P/S Насчёт TBN через maxscript – насколько я знаю, не появилось такой возможности.

  7. Sergey пишет:

    Пасибо! Хороший наглядный урок!
    ——————————
    http://3dzon.ru

Оставить комментарий

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>