Render.ru

Сплайн между двух точек на поверхности объекта по кратчайшему пути

Владислав Бодюл

Активный участник
Рейтинг
15
#1
Ради интереса хотел сделать скрипт который строит сплайн между двух точек на поверхности объекта по кратчайшему пути.

Каким оптимальным способом можно это сделать? Немного погуглив, заметил что например для измерения длины используют развёртку объекта.
По этому я тоже думаю использовать развёртку.
Вот что придумал, но может есть что-то по проще:
Первым делом сделаем копию объекта, и дальше работаем с ней.

Скрин #1
Сначала выделяем полигоны по которым должен будет проходить сплайн. Для этого используем волновой алгоритм (Алгоритм Ли). А в место ячеек будут полигоны. Применяем ещё Grow на всякий случай. После чего, оставляем только выделенные полики, остальные удаляем.

Скрин #2
Теперь разворачиваем эту поверхность. Делаем Pelt и Relax.
На юви координатах находим эти две точки. Далее от первой точки двигаемся к второй с определённым шагом. Например всю длину вектора разбить на 100 шагов. То после первого шага мы получим [0.104,0.108,0]. Конвертируем полученные юви координаты обратно в мировые, и по ним строим сплайн. От количества шагов будет зависеть плотность сплайна (Скрин #3).

 
Последнее редактирование:

moreeasy

Знаток
Рейтинг
25
#2
Сразу оговорюсь - с MAXscript-ом на "вы" и шопотом. Поэтому не обессудьте за наивность :
ratio.gif
 

Вадим_Вегас

Активный участник
Рейтинг
7
#5
Если с любым то нужно построить плоскость, только необходимо определить в каком положении рез - с той же коробкой можно по зеленой линии пойти, а можно по "задней" стороне. И после того как вопрос будет решен (в какую сторону резать) можно создать точки на пересечении плоскости и объекта. В maxscript есть опция выравнивания положения объекта по поверхности другого. Соответственно скрипт создаст недостающие точки, они будут выделены потом ребра между выделенными точками. Есть только одно но на конечных точках если они располагаются где-нибудь в центре полигонов необходимо будет создать дополнительные ребра которые вызовут появление треугольных полигонов (что не есть хорошо)
 
Последнее редактирование:

Вадим_Вегас

Активный участник
Рейтинг
7
#6
Ради интереса хотел сделать скрипт который строит сплайн между двух точек на поверхности объекта по кратчайшему пути.

Каким оптимальным способом можно это сделать? Немного погуглив, заметил что например для измерения длины используют развёртку объекта.
По этому я тоже думаю использовать развёртку.
Вот что придумал, но может есть что-то по проще:
Первым делом сделаем копию объекта, и дальше работаем с ней.

Скрин #1
Сначала выделяем полигоны по которым должен будет проходить сплайн. Для этого используем волновой алгоритм (Алгоритм Ли). А в место ячеек будут полигоны. Применяем ещё Grow на всякий случай. После чего, оставляем только выделенные полики, остальные удаляем.

Скрин #2
Теперь разворачиваем эту поверхность. Делаем Pelt и Relax.
На юви координатах находим эти две точки. Далее от первой точки двигаемся к второй с определённым шагом. Например всю длину вектора разбить на 100 шагов. То после первого шага мы получим [0.104,0.108,0]. Конвертируем полученные юви координаты обратно в мировые, и по ним строим сплайн. От количества шагов будет зависеть плотность сплайна (Скрин #3).

Все неплохо, но у меня есть одно замечание вы же режите по сути плоскостью, а чтобы определить плоскость требуется как минимум 3 точки. Ведь если вы попробуете построить семейство плоскостей по вашему рисунку вы увидите что маршрут указанный вами это не единственный вариант соединения этих 2 точек. Учитывая этот факт задача по отысканию кратчайшего маршрута между 2 точками спроецированной на 3D объект 2D линии не так тривиальна.
 
Сверху