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

модификатор morpher перенумерация вертексов

Тема в разделе "Моделирование", создана пользователем ssvsergey, 18 авг 2014.

Модераторы: He77ga, Артер
  1. ssvsergey

    ssvsergey Пользователь сайта

    С нами с:
    18.08.2014
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Все сталкивались наверное с этой проблемой-модификатор morpher рвет другое тело на куски,проблема известна: при добавлении или изъятии полигонов при ретопологии ,вертексам присваивается не одинаковая нумерация.Вопрос о одинаковой нумерации вроде бы решал один скрипт - называется morphix,работает только на 8 и 9 максе,но у меня на 9-м почему-то долго думал,но так и не заработал.Кто-нибудь решил эту проблему?Ответы нельзя перенумеровать не принимаются,подтверждение скрипт morphix.Даже можно пойти на переименование вручную,только нужна подробная инструкция ,а лучше всего подсказку на скрипт.Интересно решение именно в максе,без других программ.Еще очень странно ,что autodesk до сих пор не придумал решение этой проблемы,может я ошибаюсь и есть у них решение.
     
  2. Андрей Бельский

    Андрей Бельский Активный участник

    С нами с:
    20.12.2001
    Сообщения:
    404
    Симпатии:
    22
    Баллы:
    18
    решение проблемы применять морфер к оригиналу и скинврапом на него вешать новую сетку...
     
  3. ssvsergey

    ssvsergey Пользователь сайта

    С нами с:
    18.08.2014
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    2
    Я немного не понимаю-скинврап относится к скину,если убрать скин,то нумерация точек останется изначальной,т.е. будут опять лоскуты при морфе.Объясню подробнее у меня 2 меша без скина,навесим любой скин на 1 ,скинврап на 2-й затем колдуем и получаем приемлемый результат,но когда я убираю скин,разве изменится нумерация точек?Я сейчас на работе,проверить не могу,поэтому подскажите где я заблуждаюсь.
     
  4. igorznag

    igorznag Знаток

    С нами с:
    23.04.2010
    Сообщения:
    1.255
    Симпатии:
    173
    Баллы:
    65
    Простой пример для частного случая:
    Объекты должны быть Editable Poly и без модификаторов.
    Объекты должны иметь одиннаковую топологию.
    Объекты должны состоять только из одного элемента.
    Выделяем первый объект.
    На уровне полигонов выделяем один полигон.
    На уровне ребер выделяем одно ребро выделенного полигона.
    На уровне вершин выделяем одну вершину выделенного ребра.
    Выделяем второй объект.
    На уровне полигонов выделяем один соответствующий полигон.
    На уровне ребер выделяем одно соответствующее ребро выделенного полигона.
    На уровне вершин выделяем одну соответствующую вершину выделенного ребра.

    Запускаем скрипт. Открывается новое окно.
    Нажимаем кнопку Pick Master Object и выбираем первый объект.
    Нажимаем кнопку Pick Slave Object и выбираем второй объект.
    Нажимаем кнопку Apply.
    Скрипт создает третий объект с правильной нумерацией и выделяет его.

    Код:
    try destroydialog  morph_test catch()
    rollout morph_test "Morph test"
    (
    fn filt_obj obj = classof obj==Editable_Poly
    pickbutton pbtn_master "Pick Master Object" pos:[5,5] width:110 filter:filt_obj
    pickbutton pbtn_slave "Pick Slave Object" pos:[5,30] width:110 filter:filt_obj
    button btn_apply "Apply" pos:[40,60]; 
    on pbtn_master picked obj do pbtn_master.text=obj.name
    on pbtn_slave picked obj do pbtn_slave.text=obj.name
    on btn_apply pressed do
    (
    undo on
    (
    try
    (
    mobj=pbtn_master.object; sobj=pbtn_slave.object
    if mobj!=undefined and sobj!=undefined and mobj!=sobj then
    (
    
    mnf=polyop.getNumfaces mobj;mne=polyop.getNumedges mobj;mnv=polyop.getNumverts mobj;
    snf=polyop.getNumfaces sobj;sne=polyop.getNumedges sobj;snv=polyop.getNumverts sobj;
    if mnf==snf and mne==sne and mnv==snv then
    (
    mfs=(polyop.getFaceSelection mobj) as array
    mes=(polyop.getEdgeSelection mobj) as array
    mvs=(polyop.getVertSelection mobj) as array
    sfs=(polyop.getFaceSelection sobj) as array
    ses=(polyop.getEdgeSelection sobj) as array
    svs=(polyop.getVertSelection sobj) as array
    if mfs.count==1 and mes.count==1 and mvs.count==1 and sfs.count==1 and ses.count==1 and svs.count==1 then
    (
    meufs=((polyop.getEdgesusingface mobj mfs)*(mes as bitarray)) as array
    seufs=((polyop.getEdgesusingface sobj sfs)*(ses as bitarray)) as array
    if meufs.count==1 and seufs.count==1 then
    (
    mvues=((polyop.getVertsusingedge mobj mes)*(mvs as bitarray))as array
    svues=((polyop.getVertsusingedge sobj ses)*(svs as bitarray))as array
    if mvues.count==1 and svues.count==1 then
    (
    mhface=mfs[1]; mhedge=mes[1]; mhv=mvs[1];
    shface=sfs[1]; shedge=ses[1]; shv=svs[1];
    dobj=copy mobj; dobj.transform=sobj.transform;select dobj
    
    mh=#();mh[1]=#(mhface,mhedge,mhv);sh=#();sh[1]=#(shface,shedge,shv)
    mf=#();mv=#();sv=#()
    while mh.count>0 do 
    (
    mh_temp=#();sh_temp=#()
    for k=1 to mh.count do
    (
    mcurf=mh[k][1];mcure=mh[k][2];mcurv=mh[k][3];
    scurf=sh[k][1];scure=sh[k][2];scurv=sh[k][3];
    if finditem mf mcurf==0 then append mf mcurf
    for j=1 to (polyop.getfacedeg mobj mcurf) do
    (
    if finditem mv mcurv==0 then (append mv mcurv;append sv scurv)
    --mf
    mfue=((polyop.getfacesusingedge mobj mcure)-#{mcurf}) as array
    sfue=((polyop.getfacesusingedge sobj scure)-#{scurf}) as array
    if mfue.count==1 then if finditem mf mfue[1]==0 then 
    (
    append mf mfue[1];
    append mh_temp (#(mfue[1],mcure,mcurv));
    append sh_temp (#(sfue[1],scure,scurv));
    )--if fue.count==1 then if finditem mf fue[1]==0 then 
    --me
    mev=polyop.getedgeverts mobj mcure
    if mev[1]!=mcurv then mcurv=mev[1] else mcurv=mev[2]
    meuv=polyop.getedgesusingvert mobj #{mcurv}
    meuf=polyop.getedgesusingface mobj #{mcurf}
    mcure=(((meuv*meuf)-#{mcure})as array)[1]
    --se
    sev=polyop.getedgeverts sobj scure
    if sev[1]!=scurv then scurv=sev[1] else scurv=sev[2]
    seuv=polyop.getedgesusingvert sobj #{scurv}
    seuf=polyop.getedgesusingface sobj #{scurf}
    scure=(((seuv*seuf)-#{scure}) as array)[1]
    )--for j=1 to (polyop.getfacedeg mobj mh[k][1] do
    )--for k=1 to mh.count do
    mh=mh_temp;sh=sh_temp
    )--while mh.count>0 do 
    
    ---set pos vert
    for i=1 to mv.count do
    (vcoord=polyop.getVert sobj sv[i]; polyop.setVert dobj mv[i] vcoord)
    redrawViews()
    )--if mvues.count==1 and svues.count==1 then
    )--if meufs.count==1 and seufs.count==1 then
    )--if mfs.count==1 and mes.count==1 and mvs.count==1 
    )--if mnf==snf and mne==sne and mnv==snv then
    )--if mobj!=undefined and sobj!=undefined) then
    )catch()--try
    )--undo on
    )--on btn_apply pressed do
    );createdialog morph_test 120 90
    Чтобы запустить скрипт нужно:
    1. Создаем текстовый файл (NotePad) и копируем код (текст) скрипта.
    2. Сохраняем текстовый файл с названием "test.ms"
    3. В главное меню MaxScript выбираем пункт Run Script. Выбираем файл "test.ms"
     
Модераторы: He77ga, Артер

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