Обнаружить точку столкновения между сеткой и сферой?
Я пишу симулятор физики с использованием Ogre и MOC.
У меня есть сфера, которую я снимаю с позиции камеры, и она движется в направлении, к которому обращена камера, используя вектор вперед камеры.
Я хотел бы знать, как я могу обнаружить точку столкновения между моей сферой и другой сеткой.
Как я смогу проверить точку столкновения между двумя сетками, используя MOC или OGRE?
Обновление: должен был упомянуть об этом ранее. Я не могу использовать стороннюю физическую библиотеку, так как мне нужно разработать ее самостоятельно (проект uni).
2 ответа
Я думаю, что лучше всего будет использовать специализированную физическую библиотеку.
Это сказал. Если бы я подумал об этой проблеме, я бы заподозрил, что это не так сложно:
Сфера имеет середину и радиус. Для каждой точки сетки сделайте следующее:
- проверьте, находится ли точка внутри сферы.
- если он проверяет, находится ли он ближе к центру, чем ранее найденная точка (если есть)
- если это так... сохранить эту точку как точку столкновения
Конечно, эта рутина будет довольно медленной. Несколько вещей, чтобы ускорить это:
- для первого тривиального отклонения, сначала посмотрите, сталкивается ли ограничивающая сфера сетки
- не вычисляйте квадратные корни при проверке расстояний... вместо этого используйте квадраты длины (намного быстрее)
- Вместо того, чтобы сравнивать каждую точку сетки, используйте алгоритм пространственного деления пространства (квадри / BSP) для сетки, чтобы быстро исключить группы точек
Ах... и эта процедура работает, только если сфера движется не слишком быстро (относительно сетки). Если он будет перемещаться очень быстро, и вы будете пробовать его X раз в секунду, скорее всего, сфера пролетит прямо через сетку без всякого столкновения. Чтобы преодолеть это, вы должны использовать "развернутые объемы", которые в основном превращают вашу сферу в трубу. Делать математику экспоненциально сложно.
Принятое решение здесь не работает. Это будет работать даже в том случае, если плотность сетки, как правило, достаточно высока, чтобы никакие две точки на сетке не были дальше друг от друга, чем диаметр вашей сферы столкновения. Представьте себе крошечную сферу, запущенную на небольшом расстоянии по случайному вектору в огромной сетке куба. Сетка куба имеет только 8 вершин. Каковы шансы, что куб на самом деле попадет в один из этих 8 вершин?
Это действительно должно быть сделано с столкновением каждого полигона. Вы должны быть в состоянии проверить пересечение многоугольника и сферы (и, кроме того, цилиндра, если хотите избежать туннелирования, как упоминалось выше). Существует немало ресурсов для этого в Интернете и в виде книги, но http://www.realtimerendering.com/intersections.html может быть полезной отправной точкой.
Комментарии об оптимизации хорошие. Возможности раннего выхода (возможно, быстрая проверка на ограничивающую сферу или ограничивающий объем для сетки). Даже если вы определили, что находитесь в ограничивающем томе, возможно, было бы неплохо отсеять неожиданные полигоны (слишком далеко, лицом в неправильном направлении и т. Д.) Из списка потенциальных кандидатов.