2010-05-09 2 views
10

Я пишу игру, которая использует 3D-модели для рисования сцены (сверху-вниз орфографической проекции), но 2D-физический движок для расчета реакции на столкновений и т. Д. У меня есть несколько 3D-активов, для которых я хотел бы иметь возможность автоматически генерировать hitbox путем «срезания» 3D-сетки с плоскостью XY и создания многоугольника из результирующих ребер.Создайте двумерный многоугольник из 3D-сетки

Google не дает мне этого (и не очень полезного материала на SO тоже). Предложения?

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

+2

Учитывая ваше описание, может ли быть приемлемым проецирование 3D-сетки на 2D-плоскость? Проецирующая часть проста и сводит вопрос к «созданию многоугольника из связки перекрывающихся треугольников», что может быть проще решить, особенно если ваша проекция выпуклая. – Thomas

+1

Возможно, вы можете рассказать нам больше о вашей сетке. Является ли он выпуклым? Это связано? Закрыто ли? Имеет ли он нулевой род? Как он представлен в памяти? – Thomas

+0

Ячейки не выпуклые, но они будут связаны и замкнуты и имеют нулевой род. – nornagon

ответ

6

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

Вот один из способов сделать это:

T <- the set of all triangles 
P <- {} 
while T is not empty: 
    t <- some element from T 
    remove t from T 
    if t intersects the plane: 
    l <- the line segment that is the intersection between t and the plane 
    p <- [l] 
    s <- l.start 
    while l.end is not s: 
     t <- the triangle neighbouring t on the edge that generated l.end 
     remove t from T 
     l <- the line segment that is the intersection between t and the plane 
     append l to p 
    add p to P 

Это будет работать в O (п) для п треугольников, при условии, что ваши треугольники имеют указатели на свои трех сосед, и что T поддерживает постоянная время абсорбции (например, хэш-набор).

Как и все геометрические алгоритмы, дьявол находится в деталях. Подумайте о случаях, когда вершина треугольника находится точно в плоскости, например.

+0

Спасибо, теперь мне просто нужно немного подумать о том, как определить, какой треугольник соседствует с другим треугольником, на каком краю ... – nornagon

+0

Вот почему я спросил, как ваша сетка представлена ​​в памяти. Вы можете предварительно обработать сетку, связывая края, если они разделяют две вершины. – Thomas

+0

Вы также можете сначала перебрать все треугольники, сформировав сегменты линий и сохранить указатели назад к исходным треугольникам. Затем сверните все сегменты линии и соедините их. Это сэкономит вам фазу предварительной обработки, но может быть медленнее, если вы делаете это много раз. – Thomas

2

Вы можете сделать это с помощью геометрии, найдя все полигоны, которые пересекаются с плоскостью, а затем найдут точный отрезок пересечения. эти сегменты являются линиями двумерного многоугольника, который вы ищете.

+1

Как заказать сегменты? – nornagon

+0

сегменты, которые находятся рядом, происходят из двух треугольников, которые имеют один и тот же край. – shoosh