Render.ru

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

CRYSIS_CHINGIS

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

igorznag

Мастер
Рейтинг
103
#22
Код:
ga=$geometry as array; convertToMesh g
i=1;j=1;m=undefined; for g in ga do(
if i==1 do (m=editable_mesh();m.name=j as string;j+=1)
meshop.attach m g attachMat:#MatToID;i+=1;if i>300 do i=1)
 

igorznag

Мастер
Рейтинг
103
#24
Код:
ga=$geometry as array; convertToMesh ga
for g in ga where isvalidnode g do
(na=getNodeByName g.name all:true exact:true; if na.count>1 do
(m=editable_mesh();m.name=g.name;for n in na do meshop.attach m n))
 

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
#25
В сцене есть объект у которых большое количество материалов (например 700). Имеется скрипт, который делит этот объект на два других (у одного 32 материала, у другого - остаток материалов)



objs=objects as array
for obj in objs where classOf obj == Editable_Mesh do
(
obj_mat_list_count=obj.Material.MaterialList.Count
if obj_mat_list_count>32 and obj_mat_list_count<=756 then
(
face_list_by_id=#(); for i=1 to (getNumFaces obj) do
if(getFaceMatID obj i>32)then append face_list_by_id i
newMesh = meshop.detachFaces obj face_list_by_id delete:true asMesh:true
update obj --update the mesh
obj_new = Editable_mesh() --create an empty Editable_mesh
obj_new.name=obj.name+"_1"; obj.name+="_0"
obj_new.mesh = newMesh --assign the detached faces to the new mesh
obj_new.transform=obj.transform; obj_new.parent=obj.parent
update obj_new--update the mesh
-----------
m1=multimaterial(); m1_mat_count=0; m2=multimaterial(); m2_mat_count=0;
m1.name=obj.name; m2.name=obj_new.name
for i=1 to obj.material.materialList.count do
(
mat_id=obj.material.materialIDList
if(mat_id>32)then
(
m2_mat_count+=1;
for k=1 to (getNumFaces obj_new) do
if(getFaceMatID obj_new k == mat_id)then
setFaceMatID obj_new k m2_mat_count
m2.materialList.count=m2_mat_count;
m2.materialList[m2_mat_count]=copy obj.material.materialList;
)--if(obj.material.materialIDList>32)then
else
(
m1_mat_count+=1; m1.materialList.count=m1_mat_count;
m1.materialList[m1_mat_count]=copy obj.material.materialList;
m1.materialIDList[m1_mat_count]=obj.material.materialIDList;
)--else if(mat_id>32)then
)--for i=1 to obj.material.materialList.count do
obj.material=m1;obj_new.material=m2;
)--if obj.Material.MaterialList.Count > 32 then
)--for obj in objs where classOf obj == Editable_Mesh do


Просьба: Нужно чтобы автоматически делились остатки по 32 материала (и получится в сцене 21 объект с 32 материалами и 1 объект с 28 материалами)
 

igorznag

Мастер
Рейтинг
103
#26
Код:
max_ids=32;         objs=objects as array
for obj in objs where classOf obj == Editable_Mesh do 
( 
obj_mat_list_count=obj.Material.MaterialList.Count;acc1=0;
if obj_mat_list_count>max_ids then 
( 
max_ids_temp=0
while getNumFaces obj>0 do
(
face_list_by_id=#(); 
for i=1 to (getNumFaces obj) do
(
fmid=getFaceMatID obj i
if(fmid>max_ids_temp and fmid<=max_ids_temp+max_ids)then append face_list_by_id i
)--for i=1 to (getNumFaces obj) do
if face_list_by_id.count>0 then
(
newMesh = meshop.detachFaces obj face_list_by_id delete:true asMesh:true 
update obj --update the mesh 
obj_new = Editable_mesh() --create an empty Editable_mesh 
obj_new.name=obj.name+"_"+(acc1 as string);
obj_new.mesh = newMesh --assign the detached faces to the new mesh 
obj_new.transform=obj.transform; obj_new.parent=obj.parent 
update obj_new--update the mesh 
-----------------
m=multimaterial(); m_mat_count=0; m.name=obj_new.name 
for i=1 to obj.material.materialList.count do 
( 
mat_id=obj.material.materialIDList[i] 
if(mat_id>max_ids_temp and mat_id<=max_ids_temp+max_ids)then 
( 
m_mat_count+=1; 
for k=1 to (getNumFaces obj_new) do 
if(getFaceMatID obj_new k == mat_id)then 
setFaceMatID obj_new k m_mat_count 
m.materialList.count=m_mat_count; 
m.materialList[m_mat_count]=copy obj.material.materialList[i]; 
)--if(mat_id>max_ids_temp and mat_id<=max_ids_temp+max_ids)then 
)--for i=1 to obj.material.materialList[i].count do 
obj_new.material=m;acc1+=1
)--if face_list_by_id.count>0 then
max_ids_temp+=max_ids;
)--while getNumFaces obj>0 then
delete obj;
)--if obj.Material.MaterialList.Count > max_ids then 
)--for obj in objs where classOf obj == Editable_Mesh do
 

CRYSIS_CHINGIS

Пользователь сайта
Рейтинг
2
#27
Забыл написать я, вот в этом скрипте:

ga=$geometry as array; convertToMesh ga
for g in ga where isvalidnode g do
(na=getNodeByName g.name all:true exact:true; if na.count>1 do
(m=editable_mesh();m.name=g.name;for n in na do meshop.attach m n))

нужно чтобы объекты объединялись путём - Match Material to Material IDs
 

Вложения

igorznag

Мастер
Рейтинг
103
#28
Код:
ga=$geometry as array; convertToMesh ga 
for g in ga where isvalidnode g do 
(na=getNodeByName g.name all:true exact:true; if na.count>1 do 
(m=editable_mesh();m.name=g.name;for n in na do meshop.attach m n attachMat:#MatToID))
 
Сверху