Как проверить попадает точка в сложную трехмерную фигуру? Интересует сам алгоритм

darkowlom, хм, действительно, есть такое. Но тут надо действительно разбивать на баунд боксы
и это поможет, а потом уже уточнять
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
29
1 вариант:
Разбиение сложной фигуры на простые примитивы (кубы и сферы) проверять по простым формулам.
2 вариант.
Брать полигоны, вычислять вектор направления. Проецировать этот вектор на нормаль полгона и если получается отрицательная проекция, значит точка лежит под этим полигоном. Точка будет находится внутри сложной фигуры, если она будет размещаться под всеми пролигонами одновременно
24
Если обобщить, то выглядит так
  • перебираем все фигуры, в которые может попасть точка
  • отсекаем по баундинг боксам и другим простым критериям столько фигур, сколько получится
  • для оставшихся фигур прогоняем более дорогие детальные проверки, зависящие от того, что именно подразумевается под "попаданием точки в фигуру"
если задача определить, например, клик мышкой по объекту это одно, а если есть координаты точки в трехмерном пространстве и надо понять находится ли она внутри объекта это совсем другое
34
Можно рендернуть 3d объект в 2d текстуру (текстура глубины), где белым цветом будет отображена модель, а черным прозрачность. Затем просто проверить цвет пикселя в нужной точке. Это конечно если тебе нужно проверить попадание 2D точки в 3D модель (например выбор юнита в стратегии).
Подсветка объектов под курсором реализуется путем рендеринга выделяемого объекта в отдельную текстуру. Шейдер при этом используется простейший – вывод единицы в альфа канал рендер таргета, и цвета выделения в rgb каналы.
--
Если нужно проверить попадание 3D точки в 3D модель, то тогда стоит использовать raytrace (raycast). Большинство движков умеют это делать.
Загруженные файлы
24
Я не точно описал задание, это нужно реализовать в спартанских условиях, то есть, у меня есть голый язык программирования, набор полигонов и библиотека математических функций, на этом доступный инструментарий ограничен. Потому рейтрейс не подходит
Брать полигоны, вычислять вектор направления
Можно подробней как вычисляется этот вектор? Или подскажи литературу где об этом можно почитать
29
// V1, V2, V3 - точки полигона
// vN - нормаль полигона
var vEnd = new Vector3(...); // точка проверки
var vStart = (V1 + V2 + V3) / 3.0f; // центральная точка
var vDir = vEnd - vStart
var result = Vector3.Dot(vDir, vN);
if (result < 0.0f) {
	// Внутри
}
24
darkowlom, можешь немного уточнить задачу? тебе мауспик нужен (точка на экране монитора) или точка в трехмерном пространстве? в зависимости от этого нужны различные алгоритмы.
24
тебе мауспик нужен
Трехмерное пространство, у меня даже визуализации нету.
Метод предложенный алекспреем я пока не опробовал,но не будет ли такого бага, когда у сложной фигуры, напрмер человека прикрывшего лицо рукой, точка находится как раз внутри руки, и получается относительно лица и тела она вне фигуры, а результатом проверки должно быть попадание в фигуру, может я ошибаюсь, но по моему точка не будет сразу под всеми полигонами. Интересует проверка цельного объекта не деленного на баунд боксы. Или без деления на них не обойтись? делается для интереса, так что оптимизация нагрузки на систему не важна
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.