Render.ru

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

ssvsergey

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

ssvsergey

Пользователь сайта
Рейтинг
2
#3
решение проблемы применять морфер к оригиналу и скинврапом на него вешать новую сетку...
Я немного не понимаю-скинврап относится к скину,если убрать скин,то нумерация точек останется изначальной,т.е. будут опять лоскуты при морфе.Объясню подробнее у меня 2 меша без скина,навесим любой скин на 1 ,скинврап на 2-й затем колдуем и получаем приемлемый результат,но когда я убираю скин,разве изменится нумерация точек?Я сейчас на работе,проверить не могу,поэтому подскажите где я заблуждаюсь.
 

igorznag

Мастер
Рейтинг
103
#4
Простой пример для частного случая:
Объекты должны быть 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"
 
Сверху