Форум программистов, компьютерный форум, киберфорум
Программирование графики
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,037

Определить, что одно тело находится внутри другого

05.05.2025, 17:38. Показов 1490. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть два тела, заданных треугольниками.
Есть задача пересечения двух этих тел.
В общем случае, если поверхности этих тел пересекаются, то пересекаются и сами эти тела
Задача пересечения поверхностей - это задача пересечения составляющих их треугольников, она решена

Но есть особый случай, когда одно тело полностью находится в другом,
в этом случае поверхности тел не пересекаются.

как определить этот случай?

нашёл как вариант считать по пересечению луча (чётное/нечётное количество раз),
но это требует больших вычислительных затрат
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2025, 17:38
Ответы с готовыми решениями:

Вычисление расстояния коллизии между коллайдерами. (на сколько один коллайдер находится внутри другого)
Добрый день, легенды Unity, help Возникла необходимость вычисления расстояния коллизии, именно на...

Определить на какой половине объекта находится другой объект
Помогите пожалуйста! Предположим, есть кот и есть ёлка. Ёлка должна стоять на месте и вращаться...

SFML OpenGL одна текстура находится поверх другой
Одна текстура находится поверх другой

11
2 / 2 / 0
Регистрация: 15.07.2024
Сообщений: 12
08.05.2025, 08:33
Построить aabb для двух тел, если один из aabb полностью лежит в другом значит и все треугольники полностью лежат в нем.
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,866
Записей в блоге: 2
08.05.2025, 15:49
Цитата Сообщение от glBegin Посмотреть сообщение
Построить aabb для двух тел, если один из aabb полностью лежит в другом значит и все треугольники полностью лежат в нем.
Не годится, пример: 2 сферы, большая и маленькая, что может спокойно уместиться в "уголке aabb" большой. А что говорит дипсик?
0
2 / 2 / 0
Регистрация: 15.07.2024
Сообщений: 12
09.05.2025, 09:06
Цитата Сообщение от Igor3D Посмотреть сообщение
Не годится, пример: 2 сферы, большая и маленькая, что может спокойно уместиться в "уголке aabb" большой. А что говорит дипсик?
Хмм... тоже верно. Можно доразвить идею. Предположим один aabb полностью содержится в другом. Алгоритм может быть таким:
1. Определяем наибольший aabb.
2. Подгоняем под размер модели ортогональную матрицу
3. Рисуем объект
4. Считываем из буфера глубины область пикселей отрисованного объекта в массив 1
5. Рисуем второй объект
6. Считываем из буфера глубины область пикселей отрисованного объекта в массив 2
7. Попиксельно сравниваем массив 1 и 2
Случай a: Если есть различие в массиве переходим к задаче пересечения треугольников. Тут кстати опять нам могут помочь aabb, считаем область пересечения двух aabb и ищем пересекающиеся треугольники только в этой области, тут еще можно использовать окто деревья для ускорения...
Случай b: Если различий нет, нужно проверить z-интервал поскольку больший объект может заслонять меньший но не пересекать. Поварачиваем перпендикулярно взгляду камеру и повторяем с пункта 2.

Вариант хардкорный, но достаточно быстрый. Естественно нужно включить тест глубины...
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
09.05.2025, 13:40
Поля расстояний между точками помогут.
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,866
Записей в блоге: 2
09.05.2025, 14:54
Цитата Сообщение от glBegin Посмотреть сообщение
Вариант хардкорный
Да какой-то он "натужный" или "суетливый", неужели нужно столько приседаний? Задача ведь не выглядит такой уж сложной. Нужно глянуть теорию/готовые решения.

Заметим что ссылаться на (якобы) решенную задачу пересечения треугольников явно неуместно, там долго пыль глотать, и как делать - неясно
0
2 / 2 / 0
Регистрация: 15.07.2024
Сообщений: 12
09.05.2025, 16:23
Цитата Сообщение от Igor3D Посмотреть сообщение
Да какой-то он "натужный" или "суетливый", неужели нужно столько приседаний? Задача ведь не выглядит такой уж сложной. Нужно глянуть теорию/готовые решения.
Заметим что ссылаться на (якобы) решенную задачу пересечения треугольников явно неуместно, там долго пыль глотать, и как делать - неясно
Но быстрый, и пока вы там будете выдумывать алгоритмы за O(n^2), GPU сделает за вас всю работу.
Решать математикой, ну попробуйте, есть варианты? Опять же если задача решена, значит пересечений треугольников не было, а значит либо тело полностью лежит внутри другого либо полностью снаружи...
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,866
Записей в блоге: 2
09.05.2025, 19:00
Цитата Сообщение от Khludenkov Посмотреть сообщение
нашёл как вариант считать по пересечению луча (чётное/нечётное количество раз),
но это требует больших вычислительных затрат
Кажется это и есть верный путь. Причем достаточно одного луча что стартует с поверхности/полигона меньшего объекта по оси X. Да, перебираем все полигоны обоих объектов, но лишь однажды, поэтому никаких "больших вычислительных затрат" нет. Отбрасываем стартовые пересечения с меньшим и требуем нечет с большим. Конечно при условии что "пересечений нет" и что оба объекта имеют объем

Добавлено через 2 часа 14 минут
Вот полезное утверждение
При отсутствии пересечений если хоть один вертекс меньшего внутри большего - значит и весь меньший внутри
Уточним детали
- по bounding box (он же aabb) находим кто там меньший и больший. По каждой оси диапазон значений меньшего должен быть внутри большего

- бросаем луч по оси X (например) из любого вертекса меньшего. Прогоняем все полигоны только большего, число пересеченных должно быть нечетным
0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
10.05.2025, 02:40
Цитата Сообщение от Igor3D Посмотреть сообщение
Кажется это и есть верный путь. Причем достаточно одного луча что стартует с поверхности/полигона меньшего объекта по оси X. Да, перебираем все полигоны обоих объектов, но лишь однажды, поэтому никаких "больших вычислительных затрат" нет. Отбрасываем стартовые пересечения с меньшим и требуем нечет с большим. Конечно при условии что "пересечений нет" и что оба объекта имеют объем
Это самый оптимальный способ для общего случая. Не считая всякие частности для прямоугольников сфер и прочего.

Цитата Сообщение от Igor3D Посмотреть сообщение
Да, перебираем все полигоны обоих объектов
Заранее построенный индекс R-Tree для геометрии отбросит лишние полигоны. R-Tree.

Пару лет назад писал пример для объяснения как работает определение коллизий с помощью полей расстояний
https://www.shadertoy.com/view/3scczB
Компьютеру обычно гораздо проще искать расстояния между точками чем решать систему уравнений треугольника и прямой в трехмерном пространстве для определения коллизии.

Топикстартеру советую гуглить в сторону "R-Tree for poligons" можно в варианте "R-Tree(SRT)" и в сторону "Поля расстояний".
0
10.05.2025, 15:37

Не по теме:

Цитата Сообщение от MallSerg Посмотреть сообщение
Заранее построенный..
Если луч один (или их остаточно мало), то никакое построение структур/деревьев для поиска себя не оправдает. Возможно "упасть на хвост" имеющимся, напр движки физики такие структуры уже имеют.

Цитата Сообщение от MallSerg Посмотреть сообщение
Пару лет назад писал пример для объяснения как работает определение коллизий с помощью полей расстояний
https://www.shadertoy.com/view/3scczB
Компьютеру обычно гораздо проще искать расстояния между точками чем решать систему уравнений треугольника и прямой в трехмерном пространстве для определения коллизии.
Не уловил идею. Ну для пары сфер работает, а для полигонов (регулярный случай) как?

0
 Аватар для MallSerg
91 / 58 / 14
Регистрация: 16.11.2018
Сообщений: 274
10.05.2025, 18:41
Цитата Сообщение от Igor3D Посмотреть сообщение
Не уловил идею. Ну для пары сфер работает, а для полигонов (регулярный случай) как?
Без разницы для чего (точки там линии треугольника или тетрайдера =)). просто определяется расстояние между объектами если расстояние до объекта отрицательное то произошла коллизия и луч прошел сквозь объект. Поля расстояний это способ определить шаг на котором ищется коллизия.
https://www.shadertoy.com/view/lslXD8

https://www.shadertoy.com/view/Xtl3Wj (строка 46 определение коллизии)

Еще хороший пример https://www.shadertoy.com/view/wltBRl (Вкладка common 109 строчка)

Ну и для тех кто любит пожестче =) https://www.youtube.com/watch?v=ajv46BSqcK4
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,866
Записей в блоге: 2
10.05.2025, 20:35
Цитата Сообщение от MallSerg Посмотреть сообщение
Без разницы для чего (точки там линии треугольника или тетрайдера =). просто определяется расстояние между объектами)
Не вводите общественность в заблуждение "Просто" оно определяется если есть аналитическое представление шейпа, причем достаточно простое. Напр ясно что аналитическое пересечение со сферой считается на порядки быстрее чем со сферой из тысяч полигонов (даже если дерево отсечет многие). Но этот случай не общий, не регулярный. Нет аналитики - с приветом.

Не по теме:

А все-таки хорошо быть молодым и верить что чудо возможно :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.05.2025, 20:35
Помогаю со студенческими работами здесь

Как уничтожить обьект, который находится в другой сцене?
как уничтожить обьект который находится в другой сцене

Поднятый предмет, когда находится в руках, проходит через стену и другие объекты
Я создаю игру в Unreal, пока на блупринтах. Проблема такая - есть, допустим шар, InteractMesh....

Как получить доступ к методу в классе, который находится в другой сцене?
Мне надо получить доступ к методу в классе, который находится в другой сцене

Игра на одном телефоне работает быстрее, чем на другом
При тестировании игри в идиторе или на телефонах друзей игра движеться нормально, но на моем...

Как правильно определить что мышь находится над GUI елементом
Всем доброго утра, дня, вечера, ночи. Недавно начал изучать Unity3d. Написал скрип для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru