Экспорт моделей из 3D Studio Max в свой формат при помощи MaxScript.
Автор: KEEP
Как написать скрипт для экспорта объектов из 3D Studio Max в свой формат.
В этой подсказке я расскажу как сделать скрипт на 3D Studio Max для экспорта моделей.
Для начала пару слов о синтаксисе скриптов. В 3D Studio Max к сожалению нет распознавания строчных букв. Т.е. переменные с именем positon_x и с именем POSITION_X одно и то же.
Комментарии в скриптах прописываются двойным минусом (--)
Например
widht = 1
height = 2
-- коментарий
-- еще один комментарий
size = width*heightА в общем синтаксис примерно похож на C++. Операции деления и умножения такие же (даже сравнение такое (через двойное равно ==)). Различие в том что элементы массива начинают отчет с единицы, а не с нуля, и каждый элемент массива может иметь свой тип данных. Потом фигурные скобки заменены на обычные, а при вызове функций перечень переменных идет через пробел, а не через запятую. Т.е. чтоб вызвать функцию создания сферы надо ввести:
Sphere “Sphere01” radius:10 pos:[0,0,0]
Выберите в меню “MAXScript” “NewScript”. Для удобства использования нашего скрипта сначала пропишем окно.
rollout roll_expmesh "Export Mesh"
(
edittext edt_path "Path" pos:[10,10] width:300 -- Это
-- путь к файлу для экспорта
button btn_Browse "Browse" pos:[320,10] width:50 -- Кнопка для
-- удобного выбора файла
button btn_exp "Export" --Кнопка экспорта
--Дальше пропишем пункты для выбора
--того что нам нужно экспортировать в файл
--т.е. (списки вершин, списки нормалей вершин, списки фейсов,
-- и координаты текстур)
checkbox chk_v "Vertex" checked:true
checkbox chk_n "Normal" checked:true
checkbox chk_f "Face" checked:true
checkbox chk_t "Texture" checked:true
on roll_expmesh open do
(
--Это функция которая запускается при открытии окна
s=selection[1].name as string
edt_path.text=(GetDir #Export)+"\\"+s+".msh"
)
on btn_browse pressed do
(
--Здесь открывается окно для выбора пути к сохранению файла
s=GetSaveFileName types:"Mesh file (*.msh)|*.msh|All files (*.*)|*.*"
if s!=undefined do
(
edt_path.text=s
)
)
on btn_exp pressed do
(
--А здесь происходит сам экспорт объекта и запись в файл
--Прописываем флаги для дальнейшего экспорта
local bV=0 --флаг вершин
local bN=0 --флаг нормалей
local bF=0 --флаг фейсов
local bT=0 --флаг текстур
--дальще устанавливаем эти флаги
if chk_v.checked==true then bV=1
if chk_n.checked==true then bN=1
if chk_f.checked==true then bF=1
if chk_t.checked==true then bT=1
--Проверяем выбран ли путь
if edt_path.text!=undefined do
(
--Создаем файл
file01=createFile edt_path.text
--Записываем наши флаги в файл чтобы потом при чтении этого
--файла можно было узнать что в нем записано а что нет
format "% " bV to:file01
format "% " bN to:file01
format "% " bF to:file01
format "%\n" bT to:file01
--Находим количество вершин в объекте
local vnum=getNumVerts selection[1].mesh
--Находим количество фейсов
local fnum=getNumFaces selection[1].mesh
--Находим количество вершин текстур в объекте
local tnum=getNumTVerts selection[1].mesh
--И записываем все это в файл
format "% " vnum to:file01
format "% " fnum to:file01
format "%\n" tnum to:file01
--Дальше всю информацию о выделенном объекте
--записываем в переменную mesh01 (так надо чтоб не было глюков)
--но только эта функция работает в шестом 3d max
-- (в 4-ом и 5-ом не проверял но в 3-ем точно не работает)
--так что если что можно обойтись
--и без нее используя selection[1].mesh
mesh01=snapshotasmesh selection[1]
if chk_v.checked==true do
(
--Записываем вершины объекта
format "vertex \n" to:file01
for j=1 to vnum do
(
local p01=[0,0,0]
p01=GetVert mesh01 j
format "% " p01.x to:file01
format "% " p01.y to:file01
format "%\n" p01.z to:file01
)
)
if chk_n.checked==true do
(
--Записываем нормали вершин объекта
format "normals \n" to:file01
for j=1 to vnum do
(
local p01=[0,0,0]
p01=GetNormal selection[1].mesh j
format "% " p01.x to:file01
format "% " p01.y to:file01
format "%\n" p01.z to:file01
)
)
if chk_f.checked==true do
(
--Здесь идет запись фейсов
--Каждый фейс содержит три вершины
--и здесь идет запись id этих вершин
format "Faces \n" fnum to:file01
for j=1 to fnum do
(
local p01=[0,0,0]
p01=GetFace selection[1].mesh j
--Так как в 3D max элементы массивов начинаются с 1-го
--а не с нулевого элемента как это принято
--во всех языках
--то будем отнимать единицу
x01=(p01.x-1) as integer
y01=(p01.y-1) as integer
z01=(p01.z-1) as integer
format "% " x01 to:file01
format "% " y01 to:file01
format "%\n" z01 to:file01
)
)
if chk_t.checked==true do
(
--Запись координат текстур идет по такому принцыпу
--Сначала записываются вершины а потом
--для каждого фейса id этой вершмны
format "texture_vertex \n" to:file01
for j=1 to tnum do
(
local p01=[0,0,0]
p01=GetTVert selection[1].mesh j
format "% " p01.x to:file01
format "% " p01.y to:file01
format "%\n" p01.z to:file01
)
format "texture_face \n" fnum to:file01
for j=1 to fnum do
(
local p01=[0,0,0]
p01=GetTVFace selection[1].mesh j
x01=(p01.x-1) as integer
y01=(p01.y-1) as integer
z01=(p01.z-1) as integer
format "% " x01 to:file01
format "% " y01 to:file01
format "%\n" z01 to:file01
)
)
close file01
)
)
)
--Дальше будем использовать ограничение на выделение объектов
--т.е. запускать макрос только если выделен один объект
if selection.count<1 then MessageBox "Select object"
if selection.count==1 do
(
--создаем главное окно
m_roll=newrolloutfloater "JSD Exporter" 400 600
--и к нему добавляем вкладку которую создали в самом начале скрипта
addrollout roll_expmesh m_roll
)26 марта 2006