Render.ru
Поддержать

Объединение всех объектов сцены в один.

ARTIS

Активный участник
Рейтинг
5
Привет. Задача, казалось бы, тривиальная, но что-то не могу решить. Нужно из множества отдельных объектов в сцене получить один объект типа меш.
Наверное, идеальным был бы вариант сколлапсить всё это дело, но в скриптах ничего похожего не нашёл.
Второй вариант - аттачить поочереди каждый объект к какому-то одному объекту. Возможно, есть ещё какие-то варианты.
Помогите, пожалуйста, переварить выше изложенные мысли в код 🙂

ARTIS

Активный участник
Рейтинг
5
Andrey _Belskiyв эдит поли есть кнопка аттач и там можно выбрать список.
Спасибо за ответ! но ничего, что пост в теме MAXScript? 🙂
И, кстати. вот ещё:
ARTISПомогите, пожалуйста, переварить выше изложенные мысли в код

igorznag

Мастер
Рейтинг
103
Пример. В новой сцене создаем 3 чайника Teapot. Запускаем скрипт:
g=$geometry as array; convertToMesh g
for i=2 to g.count do meshop.attach g[1] g[i]

ARTIS

Активный участник
Рейтинг
5
igorznagПример. В новой сцене создаем 3 чайника Teapot. Запускаем скрипт:
g=$geometry as array; convertToMesh g
for i=2 to g.count do meshop.attach g[1] g
Это то, что нужно! Спасибо огромное. Пытался делать по такому же принципу, но немного напутал с синтаксисом. Ваш вариант отлично работает!

Фигли

Пользователь сайта
Рейтинг
2
Если неважно, что все текстуры на объектах, если они есть, перепутаются при аттач, тогда да, вариант то что надо.
Не знаю, что у вас за задача, но может просто собрать все объекты в группу?

Фигли

Пользователь сайта
Рейтинг
2
Или:
g=$geometry as array; convertToMesh g
for i=2 to g.count do meshop.attach g[1] g attachMat:#IDToMat condenseMat:true deleteSourceNode:true

ARTIS

Активный участник
Рейтинг
5
ФиглиЕсли неважно, что все текстуры на объектах, если они есть, перепутаются при аттач, тогда да, вариант то что надо.
Не знаю, что у вас за задача, но может просто собрать все объекты в группу?
В данном случае, действительно, материалы не важны, т.к. потом в скрипте я назначаю этому новоиспечённому объекту совершенно новый мат. Но Ваш вариант тоже ценен, занесу его в свою библиотечку (наверняка ещё пригодится)

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
А можно скрипт, который будет присваивать ВСЕМ подматериалам объекта в разделе Shader basic parameters - Crytek Shader и в разделе Crytek Shader Basic Parameters ставить галочку Physicalize. Очень надо автоматизировать процесс.

Вложения

igorznag

Мастер
Рейтинг
103
У меня нет такого типа Shader-а и не знаю команды для него.
MacroRecorder записывает команды, когда вы вручную меняете тип shader-a на Cryteck и когда вы меняете значение для галочки Physicalize?

Чтобы записать команды, нужно:
В меню MaxScript включаем MacroRecorder.
В меню MaxScript выбираем MaxScript Listener, чтобы открыть окно.
Изменяем вручную тип shader-a на Cryteck и меняем значение для галочки Physicalize.
Если в окне MaxScript Listener появляются команды, тогда предоставляем их на форум.

igorznag

Мастер
Рейтинг
103
Выделяем объект и запускаем скрипт:
for obj in selection where obj.material!=undefined do
(ms=getclassinstances standardMaterial target:obj.material
for m in ms do (m.shaderType=2;m.physicalizeMaterial=on))

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
Можно добавить строчку в скрипт, чтобы объект увеличился до 9000

igorznag

Мастер
Рейтинг
103
Да, можно. Также можно переместить объект до 8000 и вращать объект до 7000.

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
а строчку можно ? Увеличение объекта до 9000

igorznag

Мастер
Рейтинг
103
Как вы вручную увеличиваете объект до 9000?
Какие команды MacroRecorder записывает?

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
1. Имеется сцена и на сцене много объектов (9000 объектов)
2. Нужно автоматически объединить эти объекты в один, сгруппировывая по 300 объектов (больше нельзя - вылетает макс с ошибкой
переполнения памяти). То есть получается - на сцене уже не 9000, а 30 объектов
(командой Match Material to Material IDs). Имена объектов можно давать нумерацией.

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
igorznagКак вы вручную увеличиваете объект до 9000?
Какие команды MacroRecorder записывает?
scale $ [90.00000,90.00000,90.00000]

igorznag

Мастер
Рейтинг
103
CRYSIS_CHINGISа строчку можно ? Увеличение объекта до 9000
for obj in selection where obj.material!=undefined do 
(
obj.scale=[90,90,90]
ms=getclassinstances standardMaterial target:obj.material 
for m in ms do (m.shaderType=2;m.physicalizeMaterial=on)
); redrawViews()