2013-07-27 3 views
1

У меня есть 3D-среда с псевдослучайно созданной рельефом (которая состоит из треугольников). Я хочу просто определить, если столкновение трехмерной рамки и одного из треугольников местности; как я могу это сделать? Я прочитал вопрос this, который в точности соответствует именно тому, что я хочу, но ответ не является удовлетворительным, поскольку он в основном обеспечивает только алгоритм AABB ...Простой 3D-столкновение с многоугольником

PS: треугольники определены с тремя точками 3D и ограничивающим прямоугольником может быть определена его 8 вершинами.

+2

Не могли бы вы более подробно объяснить, почему это неудовлетворительно? Очевидно, это было так, и мы не знаем, почему это не для вас. – mydogisbox

+0

Из ответа: «следующий метод ... примет объект BoundingBox и определит, находится ли он в текущем экземпляре BoundingBox. ... Вот метод обнаружения, если одно поле находится внутри другого, и если поэтому, модифицируйте коробку, чтобы переместить ее снаружи ». Я не понимаю, как ответчик отвечает на вопрос; мне кажется, что они предоставляют метод обнаружения и реагирования на столкновение AABB-AABB (никаких треугольников). Если мое понимание ошибочно, скажите, пожалуйста! – Jwosty

ответ

1

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

let objectsCollide boundingBox shape 
    shape.vertexes 
    |> Seq.forall (fun v -> boundingBox <|> vertex 
    |> not 

let (<|>) a b = 
    let vertex = a.vertexes[0] 
    vertex.neighbors 
    |> Seq.forall (fun neighbor ->if b is between v and neighbor 
             return false 
            else 
             true 
    |> not 

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

+0

Мысль об этом, но он не будет охватывать вполне все случаи (треугольник может быть своего рода «намотанным» лицом по углу коробки). Хотя алгоритм, который я собираюсь использовать на данный момент, является расширением этого: для каждой вершины потребуется усреднить каждую вершину, чтобы получить еще 3 точки на краях треугольника, а затем взять средние из них, чтобы получить 3 точки на фактическое лицо и проверить каждый из этих 9 баллов с помощью теста AABB collision. Должен работать на данный момент, но я ожидаю, что это будет ухабистая поездка для коробки ... – Jwosty

+0

В C++ есть реализация для этого: http://www.geometrictools.com/LibMathematics/Intersection/Intersection.html Я бы опубликуйте его в ответе, но он довольно длинный. – mydogisbox

+0

Я еще раз обновил свой ответ о том, что вам нужно сделать с реализацией, которую я связал, чтобы адаптировать ее к вашей проблеме. – mydogisbox