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

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

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

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

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

Первым делом сделаем копию объекта, и дальше работаем с ней.

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

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


moreeasy

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

Виталий Мартынов

Активный участник
Рейтинг
11
Может разбить на шаги по координатам ребра бокса и выбрать по условию мин дистанцию соответствующих отрезков.

Вадим_Вегас

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

Вадим_Вегас

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

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

Первым делом сделаем копию объекта, и дальше работаем с ней.

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

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


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