Render.ru

Разделение объекта по его ID материалам

Castello

Активный участник
Рейтинг
5
#1
Если у объекта кол-во matID > 32, тогда создать новый объект у которого полигоны будут равны оставшимся matID, а у исходного удалить все полигоны у которых matID > 32.

К примеру имеем объект с 40 matID.
Т.к. 40 > 32 создаем новый объект (с префиксом в имени *_new) с оставшимся 8 matID (33,34,35,36,37,38,39,40), а у исходного удаляем лишние matID, т.е. - все которые > 32 (33,34,35,36,37,38,39,40)
В итоге имеем два объекта где у первого 32 matID, а у второго - 8.
Извиняюсь, если что-то неправильно объяснил, но думаю смысл будет понятен.
 

igorznag

Мастер
Рейтинг
103
#2
Выделяем несколько объектов Editable Poly и запускаем скрипт.
Код:
for obj in selection  where classof obj==Editable_Poly do
(
mat_id_2=#(); for i=1 to (polyop.getNumFaces obj) do 
if(polyOp.getFaceMatID obj i>32)then append mat_id_2 i
polyOp.detachFaces obj mat_id_2 delete:true asNode:true name:(obj.name+"_new")
)
P.S. Создаем копию сцены перед тем, как использовать скрипт.
 

Castello

Активный участник
Рейтинг
5
#3
Разделение на два объекта происходит правильно, но надо чтобы еще материал также разделялся
Т.е. в приведеном выше примере с 40 matID, должно получится:
1) два объекта где у первого 32 matID, а у второго - 8 (скрипт работает)
2) два мульти-материала где у первого 32 под-мата, а у второго 8
 

igorznag

Мастер
Рейтинг
103
#4
Код:
for obj in selection  where classof obj==Editable_Poly do
(
mat_id_2=#(); for i=1 to (polyop.getNumFaces obj) do 
if(polyOp.getFaceMatID obj i>32)then append mat_id_2 i
obj_name=uniqueName obj.name
if(polyOp.detachFaces obj mat_id_2 delete:true asNode:true name:obj_name)then
(
obj_new=getNodeByName obj_name; obj_new.name=(obj.name+"_new")
m1=multimaterial(); m1_mat_count=0; m2=multimaterial(); m2_mat_count=0;
m1.name=obj.material.name; m2.name=obj.material.name+"_new";
for i=1 to obj.material.materialList.count do
(
if(obj.material.materialIDList[i]>32)then
(
m2_mat_count+=1; m2.materialList.count=m2_mat_count; 
m2.materialList[m2_mat_count]=copy obj.material.materialList[i];
m2.materialIDList[m2_mat_count]=obj.material.materialIDList[i];
)--if(obj.material.materialIDList[i]>32)then
else
(
m1_mat_count+=1; m1.materialList.count=m1_mat_count;
m1.materialList[m1_mat_count]=copy obj.material.materialList[i];
m1.materialIDList[m1_mat_count]=obj.material.materialIDList[i];
)--else if(obj.material.materialIDList[i]>32)then
)--for i=1 to obj.material.materialList[i].count do
obj.material=m1;obj_new.material=m2;
)--if(df_result==true)then
)--for obj in selection  where classof obj==Editable_Poly do
 

Castello

Активный участник
Рейтинг
5
#5
почти - у второго объекта matID начинаются с 33х и до 40ка
а надо чтобы с 1 и до оставшихся, в данном случае до 8ми
 

igorznag

Мастер
Рейтинг
103
#6
Код:
for obj in selection  where classof obj==Editable_Poly do
(
mat_id_2=#(); for i=1 to (polyop.getNumFaces obj) do 
if(polyOp.getFaceMatID obj i>32)then append mat_id_2 i
obj_name=uniqueName obj.name
if(polyOp.detachFaces obj mat_id_2 delete:true asNode:true name:obj_name)then
(
obj_new=getNodeByName obj_name; obj_new.name=(obj.name+"_new")
m1=multimaterial(); m1_mat_count=0; m2=multimaterial(); m2_mat_count=0;
m1.name=obj.material.name; m2.name=obj.material.name+"_new";
for i=1 to obj.material.materialList.count do
(
mat_id=obj.material.materialIDList[i]
if(mat_id>32)then
(
m2_mat_count+=1; 
obj_new.selectByMaterial mat_id clearCurrentSelection:true
face_sel=polyop.getFaceSelection obj_new;
polyOp.setFaceMatID obj_new face_sel m2_mat_count
m2.materialList.count=m2_mat_count; 
m2.materialList[m2_mat_count]=copy obj.material.materialList[i];
)--if(obj.material.materialIDList[i]>32)then
else
(
m1_mat_count+=1; m1.materialList.count=m1_mat_count;
m1.materialList[m1_mat_count]=copy obj.material.materialList[i];
m1.materialIDList[m1_mat_count]=obj.material.materialIDList[i];
)--else if(mat_id>32)then
)--for i=1 to obj.material.materialList[i].count do
obj.material=m1;obj_new.material=m2;
)--if(df_result==true)then
)--for obj in selection  where classof obj==Editable_Poly do
 

Castello

Активный участник
Рейтинг
5
#8
Можете ли его немного изменить для меня - мне надо чтобы в имени исходного объекта (у которого мат ID > 32) добавлялся префикс "_0", а у второго (остатка от исходного где мат ID от 32) префикс "_1"
И что касается их материалов, то имена матреиалов в конечном итоге просто должны быть = именам самих объектов, чтоб в скрипте не указывать obj_new.name=(obj.name+"_new"), а просто типо этого - for i in selection do if(classof i.material==Multimaterial)then i.material.name=i.name
 
Сверху