Render.ru

Правка геометри перед экспортом (DegenerateFaces)

Castello2401

Пользователь сайта
Рейтинг
2
#1
В сцене есть много EditableMesh объектов, все они должны пройти экспорт, через один плагин. При экспорте возникают ошибки, связанные с фейсами имеющие одинаковые координаты. Вот лог ошибки:
Код:
Node test has 8 degenerate faces at the following locations:
   -4.191406,  -36.529301,   12.339360
    3.627930,  -36.555168,   11.885740
   -3.646973,  -36.530762,   11.885740
    4.172363,  -36.557129,   12.339360
   -3.643555,  -35.501461,   11.885740
    4.175781,  -35.527828,   12.339360
    3.631348,  -35.525879,   11.885740
    3.631348,  -35.525879,   11.885740
Модификатор VetrexWeld с минимальными значениями помогает, но при этом иногда часть информации, геометрия искажается, что недопустимо.
Код:
meshop.removeDegenerateFaces <Mesh mesh>
Тоже не помогает, в листенере на вызов этой функции ответ всегда - false.
Вообщем задача состоит в том, чтобы исправить геометрию при минимальных её изменениях (максимальное сохранения исходных данных).
Как я вижу реализацию - скрипт перебирает все объекты сцены (EditMesh), перебирает все координаты вершин(фейсов?) находит повторения (точно так-же как мой экспортер) и "раздигает" одинаковые координаты с минимальными значениями (+/-0,00001). Этого хватит, чтобы объект прошел экспорт, но при этом не потерпел каких либо внешних изменений. Помогите пожалуйста с написанием такого скрипта.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#2
Сравнение совпадения координат точек необходимо провести только:
1) Между точек одного фейса ? (реально)
2) Между всех точек одного меша ? (максскрипт будет долго думать, и есть шанс звалить(или повесить) макс на больших сетках )
3) Между точек всех мешей в сцене ? (на максскрипте, практически не реально если только на совсем легких сценах)
 

Castello2401

Пользователь сайта
Рейтинг
2
#3
Пересмотрел геометрию, да, между точек одного фейса. Там в основном фейс который со стороны обычно выглядит как треугольник, похож на сплошную линию, т.е. одна из трех координат вершин имеет == координаты с одной из оставшихся двух вершин. Вот подобное и надо исправить путем "раздвигания" координат одинаковых точек фейса, ну и соответственно перебрать такой функцией все фейсы, всех объектов сцены.
 

Savin Denis

Модератор форума
Команда форума
Рейтинг
138
#4
Вот как вариант удаляем все фэйсы с очень маленькой площадью:

Код:
obj = $
meshop.deleteFaces obj (for f  =1 to obj.numfaces where  meshop.getFaceArea obj #{f} < 0.0001 collect f)
update obj
дальше , если не устраивает, сможешь сам у найденных феэсов потвикать точки.
 

Castello2401

Пользователь сайта
Рейтинг
2
#5
Проверил такой вариант на стандартном чайнике, на него экспортер ругался по со след координатам:
Код:
   -3.935883,   -4.171432,    0.000000
   -3.935883,   -4.171432,    0.000000
...
   -3.935883,   -4.171432,   48.785187
   -3.935883,   -4.171432,   48.785187
....
Экспорт прошел нормально (без ошибок на плохие фейсы), но со следующими издержками:
Код:
8 tverts are orphaned
Но направление куда двигаться уже примерно понятно, удалять фейсы не вариант, т.к. из-за этого могут возникать другие проблемы, да и вообще не эстетичный вариант решения проблемы. Нужно раздвигать точки, будем пробовать, спасибо за наводку в определении плохих фейсов.
 
Сверху