Коробка в сферу столкновения - PullRequest
2 голосов
/ 25 февраля 2011

Мне нужно проверить, сталкивается ли ящик со сферой.У меня есть класс BoundingBox, определенный с X, Y, Z, ширина, высота, глубина.У меня также есть класс BoundingSphere, определенный с x, y, z, radius.Как проверить, не пересекаются ли они?

Ответы [ 4 ]

3 голосов
/ 25 февраля 2011

Первое, что нужно проверить - пересекается ли BoundingBox для BoundingSphere. Причина этого в том, что это очень простой способ исключить более сложную математику.

Следующим шагом было бы взять каждую из шести плоскостей (или двенадцать треугольников) ограничительной рамки и выполнить тест от точки до многоугольника на них до центра сферы. Если один из них меньше радиуса сферы, то у вас есть удар.

Код Matlab для расстояния от полигона до точки: http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon

1 голос
/ 25 февраля 2011

Если вы хотите сохранить тест на уровне, который вы описали, вы можете поместить ограничивающий прямоугольник вокруг сферы, где ширина, высота и глубина = 2r. Конечно, это допускает риск ложных срабатываний при столкновениях в «неполярных» или «неэкваториальных» точках на сфере. Чтобы решить эту проблему, вы можете подумать о создании ряда иерархических ограничивающих рамок для повышения степени детализации тестов попаданий в этих проблемных регионах.

Вы можете также подойти к проблеме с уровня рендеринга. Поскольку вы не можете визуализировать сферу, обычно используется какая-то полигональная сетка. Тестирование попадания между 2D (или 3D) полигонами - простое упражнение.

0 голосов
/ 24 сентября 2012

В Graphics Gems есть глава Джима Арво.

Я полагаю, что устаревшая ссылка выше использовалась для указания на его код, поскольку в URL есть "arvo".Эта ссылка работает - по крайней мере, прямо сейчас.

0 голосов
/ 25 февраля 2011

Вы просто должны проверить все углы ограничительной рамки на расстоянии от центра сферы. Вот некоторый псевдокод:

bool collidesWith(BoundingBox b, BoundingSphere s) {
  for(Vertex v in b) {
    if(distanceBetween(v, s.center) <= s.radius)
      return true;
  }
  return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...