Render.ru
Поддержать

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

Ofigelof

Пользователь сайта
Рейтинг
2
Пишу скрипт который объединяет все вершины объекта имеющие одинаковые координат.
Пока есть только это, выдаёт ошибку.

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
Выдели все вершины объекта (EditablePoly) и на панели Modify в свитке Edit Vertices нажми кнопку Weld (установи Weld Threshold = 0.001) Или тебя не устраивает как работает Weld?

Ofigelof

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

igorznag

Мастер
Рейтинг
103
Если через 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 является медленным и неэффективным из-за большого количества операций.