Всем привет! Без долгих разъяснений - сразу к делу. Сегодня весьма неожиданно даже для меня самого решилась одна долго мучающая меня проблема. Не слишком часто, но все же иногда мне приходится в своей работе в 3ds MAX использовать такой замечательный компаунд-объект как ShapеMerge. С его помощью можно, например, быстро вырезать отверстие в поверхности. Однако, ShapeMerge имеет один досадный недостаток: после проецирования сплайна на поверхность остается большое количество лишних вертексов:
Так происходит потому что любой полигон, состоящий из любого количества вертексов и ребер на самом деле состоит из треугольников:При проецировании сплайна, кроме вертексов, которые определяют форму будущего отверстия, создаются еще и вертексы, которые попадают на места пересечения проекции сплайна и скрытых ребер (те что отображаются пунктиром). Насколько я понимаю, процесс проецирования идет от от вертекса сплайна к вертексу,и каждый раз, когда на поверхности меша режется новое ребро, появляются и новые скрытые ребра, а значит и новые лишние точки.Как бы то ни было, меня интересует, как можно убрать все лишнее? Раньше я делал это вручную с помощью кнопки Remove в режиме вертексов. Это несложно, но только нужно следить за тем чтобы удалять именно лишние вертексы а не формообразующие. В некоторых местах, там где кривизна сплайна небольшая, сделать такое различие бывает трудно. Если сплайн сложной формы, и достаточно протяженный (например, нужно вырезать дорогу со множеством поворотов в рельефе) то такое ручное удаление лишних вертексов может занять часы. И вот сегодня нашлось автоматизированное решение такой задачи, реализованное в виде макс скрипта. Суть его состоит в том, чтобы найти вертексы, отвечающие двум условиям: 1) от них должно отходить ровно два ребра2) эти два ребра должны лежать на одной прямой. Я не очень хорошо знаю макс скрипт, поэтому я полез в справку, и что же я там нашел? Именно, я нашел практически готовое решение в одном из примеров. Странно, что об этом мало пишут на форумах. Скрипт доступен по ссылке:
https://yadi.sk/d/Mk9DuesntibYQ
Достаточно скопировать его в окно редактора скриптов, выделить нужный объект в сцене и нажать Ctrl+E. Не знаю, насколько это важно, но в моих примерах подопытный объект был типа Editable Poly. Вот результат его выполнения:
Как видно, остались только формообразующие вертексы. Вот пример посложнее(обратите внимание на прямые участки букв. Лишние вертексы засели в основном там):
Следует указать на одну особенность - удаление вертекса происходит не только когда его соседи с ним лежат строго на одной прямой, но и когда угол между отходящими от него ребрами незначителен (в данном случае 0,5 градуса), но не равен нулю. Это сделано для того, чтобы учесть ошибки округления при расчете. Если положить угол строго равным нулю, некоторые лишние вертексы не будут удалены. Если повысить этот порог еще выше, то можно удалить и некоторые формообразующие вертексы, и тем самым контролируемо упростить форму выреза - участки с малой кривизной станут прямыми участками. Чтобы отрегулировать этот порог, просто откройте скрипт в редакторе скриптов и исправьте значение в строчке:
if angle < 0.5 do
Вообще-то следовало сделать формочку с кнопкой, но сейчас полвторого ночи и, как я уже говорил, я не очень силен в скриптах. На этом все, буду рад, если кому пригодится. Простите за слишком топорные картинки))