Render.ru

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

ARTIS

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

ARTIS

Активный участник
Рейтинг
5
#3

igorznag

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

ARTIS

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

Это то, что нужно! Спасибо огромное. Пытался делать по такому же принципу, но немного напутал с синтаксисом. Ваш вариант отлично работает!
 

Фигли

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

Фигли

Пользователь сайта
Рейтинг
2
#7
Или:
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
#8
Если неважно, что все текстуры на объектах, если они есть, перепутаются при аттач, тогда да, вариант то что надо.
Не знаю, что у вас за задача, но может просто собрать все объекты в группу?
В данном случае, действительно, материалы не важны, т.к. потом в скрипте я назначаю этому новоиспечённому объекту совершенно новый мат. Но Ваш вариант тоже ценен, занесу его в свою библиотечку (наверняка ещё пригодится)
 

CRYSIS_CHINGIS

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

Вложения

igorznag

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

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

igorznag

Мастер
Рейтинг
103
#12
Выделяем объект и запускаем скрипт:
Код:
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))
 

igorznag

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

CRYSIS_CHINGIS

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