2011-02-25 3 views
2

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

+0

Возможный дубликат: http://stackoverflow.com/questions/4578967/cube-sphere-intersection-test (хотя предмет там говорит «куб», ответ применяется ко всем выровненным по осям полям). –

ответ

1

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

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

+0

Nice find, ссылка обновлена ​​и охватывает несколько случаев. твердотельный алгоритм с твердой сферой - это то, что я видел в большинстве игровых движков (в различных оптимизированных формах). – Kaganar

-2

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

bool collidesWith(BoundingBox b, BoundingSphere s) { 
    for(Vertex v in b) { 
    if(distanceBetween(v, s.center) <= s.radius) 
     return true; 
    } 
    return false; 
} 
+4

Это не относится к случаю, когда пересекается только одна из сторон. – corsiKa

+0

А хорошая точка - спасибо. –

+0

Это довольно атипично иметь вершины вокруг ориентированных по оси ограничительных прямоугольников, о которых просит ОП. Что еще более важно, «просто» не работает (как уже указывалось), а также слишком медленно для этого случая. – Dude

3

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

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

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

0

Там глава, в Graphics Gems Джим Arvo.

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

Смежные вопросы