1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "MAXScript", создана пользователем Castello, 10 май 2012.

Модераторы: Savin Denis
  1. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Если у объекта кол-во 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.
    Извиняюсь, если что-то неправильно объяснил, но думаю смысл будет понятен.
     
  2. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Выделяем несколько объектов 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. Создаем копию сцены перед тем, как использовать скрипт.
     
  3. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Разделение на два объекта происходит правильно, но надо чтобы еще материал также разделялся
    Т.е. в приведеном выше примере с 40 matID, должно получится:
    1) два объекта где у первого 32 matID, а у второго - 8 (скрипт работает)
    2) два мульти-материала где у первого 32 под-мата, а у второго 8
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    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
     
  5. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    почти - у второго объекта matID начинаются с 33х и до 40ка
    а надо чтобы с 1 и до оставшихся, в данном случае до 8ми
     
  6. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.256
    Симпатии:
    173
    Баллы:
    65
    Код:
    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
     
  7. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    все спасибо, отлично работает
     
  8. Castello

    Castello Активный участник

    С нами с:
    06.01.2012
    Сообщения:
    47
    Симпатии:
    0
    Баллы:
    5
    Можете ли его немного изменить для меня - мне надо чтобы в имени исходного объекта (у которого мат 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
     
Модераторы: Savin Denis

Поделиться этой страницей