Render.ru

Как сколапсировать две вершины средствами max script?

Ofigelof

Пользователь сайта
Рейтинг
2
#1
Пишу скрипт который объединяет все вершины объекта имеющие одинаковые координат.
Пока есть только это, выдаёт ошибку.
function colapse obj=
(
For index = 1 to obj.NumVerts do
(
For index2 = 1 to obj.NumVerts do
(
if obj.verts[Index] == obj.verts[Index2] then
(
obj.EditablePoly.collapse index index2
)

)
)
)
 

igorznag

Мастер
Рейтинг
103
#2
Выдели все вершины объекта (EditablePoly) и на панели Modify в свитке Edit Vertices нажми кнопку Weld (установи Weld Threshold = 0.001) Или тебя не устраивает как работает Weld?
 

Ofigelof

Пользователь сайта
Рейтинг
2
#3
ЭЭ ну хотелось бы услышать, как это можно сделать через макс скрипт, просто ради интереса...
 

igorznag

Мастер
Рейтинг
103
#4
Если через MaxScript, тогда можно использовать автоматическую функцию weldVertsByThreshold. Вариант1:
Код:
function colapse obj= 
( 
if(classof obj==Editable_Poly)then
(
obj.weldThreshold=0.001
polyOp.weldVertsByThreshold obj #{1..obj.numVerts}
)
)
Если использовать твой алгоритм, тогда попробуй так:Вариант2
Код:
function colapse obj= 
( 
if(classof obj==Editable_Poly)then
(
For index = 1 to obj.NumVerts do  
(
For index2 = 1 to obj.NumVerts do  
( 
if(index<=obj.NumVerts and index2<=obj.NumVerts)then
(
if length(obj.verts[index].pos-obj.verts[index2].pos)<=0.001 then
( 
polyOp.collapseVerts obj #{index, index2} 
)
)

)
)
)
)
Во время соединения вершин в цикле с помощью collapseVerts количество вершин объекта уменьшается и номера вершин меняются автоматически. Поэтому с одного раза не удается соединить все вершины. Для варианта2 нужно использовать функцию colapse несколько раз. Это можно сделать с помощью While и проверять произошло ли соединения или нет. Вариант2 является медленным и неэффективным из-за большого количества операций.
 
Сверху