Как реализовать привязки (Snap)

10 июля 2018 20:11
Вводные:
В сцену загружается 2 объекта (~10000-30000 вертексов)
Объекты генерируются из svg через blender.
Их можно перемещать по осям XYZ потянув за соответствующие стрелки векторов.
Задача:
Перемещать один объект по привязкам к другому, как это реализовано в том же вьюпорте blender:


Идея решения в лоб, это брать все вершины и перебирать в поиске ближайших между этими объектами, но ~20000*2 вершин это жёстко, или нет?
Посоветуйте пожалуйста как лучше поступить.
16 июля 2018 14:09
Насколько точной должна быть привязка?
Если перемещаемый объект представить в виде более простой фигуры, например бокса, то для одного из объектов задача упрощается до ~8 вершин.
Если имеем два объекта, каждый с ~ 20000 вершин, то при брутфорсе имеем 20000*20000. Такой вариант точно нежизнеспособный.
Одинаковы ли объекты по размерам? Оба ли объекта могут перемещаться?
Александр (команда Blend4Web)
twitter
17 июля 2018 15:02
Ответ на сообщение пользователя Александр Романов
Насколько точной должна быть привязка?
Если перемещаемый объект представить в виде более простой фигуры, например бокса, то для одного из объектов задача упрощается до ~8 вершин.
Если имеем два объекта, каждый с ~ 20000 вершин, то при брутфорсе имеем 20000*20000. Такой вариант точно нежизнеспособный.
Одинаковы ли объекты по размерам? Оба ли объекта могут перемещаться?

Я отвечу так как являюсь участником проекта.
Объекты по размерам разные, оба могут перемещаться и вращаться мы разрабатываем что то то типа примитивного ВЬЮ ПОРТА(как в 3д редкаторах) в браузере, с возможностью точной привязки.
20 июля 2018 14:09
Еще раз пересмотрел как это выглядит в Blender.
Поведение не такое, как я думал. Здесь при брутфорсе не будет 20000*20000.
Насколько я вижу у них снаппинг к вершине работает иным образом:
Основная задача - вычислить ближайшую к курсору вершину объекта, к которому осуществляем привязку.
Я бы решал эту задачу след образом:
Необходимо искать минимальное расстояние между лучом, направленным из камеры через координаты курсора и координатами вершин объекта привязки.
Как вычислить луч можно посмотреть здесь
 m_cam.calc_ray(m_scenes.get_active_camera(), x, y, pline);


Дальше у меня получилась след формула:
a*a = (r1-r2)*(r1-r2) - ((r1-r2)*n)^2
все участвующие компоненты - векторы
* - скалярное произведение
a*a - квадрат расстояния между очередной вершиной объекта привязки и вершиной луча (см. get_pline_initial_point)
n = направляющий вектор луча
r1 - вершина луча
r2 - очередная вершина объекта привязки

Для оптимизации имеет смысл искать минимальный a*a без вычисления квадратного корня.
Думаю, что здесь js должен справиться, но в любом случае нужно тестировать
Александр (команда Blend4Web)
twitter
16 августа 2018 17:16
Для доступа к геометрии беру два низкоуровневых метода: extract_index_array и extract_vertex_array. Но с помощью них, не представляю по каким критериям вытянуть информацию, что является углом объекта. Есть какой-то простой метод опеределения углов объекта, чтобы исключить лишние вертексы?
17 августа 2018 10:34
Что вы называете углом объекта? Что есть угол объекта у шара?
Александр (команда Blend4Web)
twitter
19 августа 2018 16:21
Ответ на сообщение пользователя Александр Романов
Что вы называете углом объекта? Что есть угол объекта у шара?

Не там будут только плоские модели (некий узор из фанеры)

надо вязаться только к острым и не слишком тупым углам.
27 августа 2018 23:29
Можно из этого метода extract_index_array получить нормали и искать углы определённой "остроты"?
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.