Я думаю, что лучше всего было бы использовать специализированную физическую библиотеку.
Это сказал. Если бы я подумал об этой проблеме, я бы заподозрил, что это не так сложно:
Сфера имеет среднюю точку и радиус. Для каждой точки сетки сделайте следующее:
- проверьте, находится ли точка внутри сферы.
- если он проверяет, находится ли он ближе к центру, чем ранее найденная точка (если есть)
- если это так ... сохранить эту точку как точку столкновения
Конечно, эта процедура будет довольно медленной.
Несколько вещей, чтобы ускорить это:
- для первого тривиального отклонения, сначала посмотрите, сталкивается ли ограничивающая сфера сетки
- не вычисляйте квадратные корни при проверке расстояний ... вместо этого используйте квадраты длины (намного быстрее)
- Вместо сравнения каждой точки сетки используйте алгоритм пространственного деления пространства (квадри / BSP) для сетки, чтобы быстро исключить группы точек
Ах ... и эта процедура работает, только если сфера движется не слишком быстро (относительно сетки). Если он будет перемещаться очень быстро, и вы будете пробовать его X раз в секунду, скорее всего, сфера пролетит прямо через сетку без всякого столкновения. Чтобы преодолеть это, вы должны использовать «развернутые объемы», которые в основном превращают вашу сферу в трубу. Делать математику экспоненциально сложно.