Глубина сортировки прямоугольных многоугольников, все части осей модели

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

3d-frame model

Все части представляют собой либо прямоугольные многоугольники, либо сегменты линии. Как это бывает в этой модели, все части многоугольника выровнены с плоскостями x, y или z, причем xy-origin работает от переднего угла модели на изображении. (можно разглядеть прямоугольное подразделение сторон, внимательно изучив, как они выглядят пропатченными вместе, но устранение этого артефакта здесь не рассматривается)

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

Обновление

Я придумал эту идею, которая может иметь что-то для нее.

сравнение прямоугольных многоугольников

С учетом плоского граничного ограничения существует 6 возможных отношений: (плоскость x-x), (плоскость x-y), (плоскость x-z), (плоскость y-y), (плоскость y-z) и (плоскость z-z).

Легко сортировать два многоугольника, если они имеют одну и ту же плоскость, остальные 3 комбинации показаны выше (xy на xz), (xy на yz) и (xz на yz), с разным порядком по глубине, что может произойти.

Я думаю, что мое условие сравнения может пойти примерно так: P1 = polygon1 и P2 = polygon2

if (P1 == xy_plane) return min(P1.z, P2.z)
if (P2 == xy_plane) return min(P2.z, P1.z)
if (P1 == xz_plane) return min(P1.y, P2.y)
if (P2 == xz_plane) return min(P2.y, P1.y)

P1 или P2 должны лежать в одной из первых двух плоскостей, поэтому для постановки задачи должно быть достаточно, необходимо подтвердить, работает ли этот подход

Update2

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

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

многоугольники в одной плоскости

Создавая серию условных утверждений, независимо от того, что было сделано в соответствии с вышеизложенным предложением, имеющим грубый аромат с обширной серией "if-else", я думаю, что в конце концов я нашел правильный парный многоугольник к сопоставлению многоугольников, так что в этом понятии можно сказать, конечно, если субъект или другой ближе.

Работая на одной стороне модели здесь, удалось создать нечто, что выглядит довольно убедительно. Процесс в целом чувствует себя близко к блокировке, но пытается избавиться от какой-то окончательной несогласованности, как-то вызывающе, поскольку старые физические тривиции, фиксирующие одну сторону, всегда нарушаются.

введите описание изображения здесь

Ответ 1

Позвольте мне добавить несколько замечаний:

Условия, что

  • все стороны многоугольника параллельны оси и что
  • многоугольники не пересекаются

недостаточно для обеспечения существования глобальной сортировки глубин полигонов - как видно из этого примера из трех прямоугольников:

чередование глубин

Также относительный порядок глубины двух объектов может зависеть от других объектов, как видно из этого 2D-примера, где порядок глубин объектов A и B, которые не скрывают друг друга, зависит от положения объекта C

введите описание изображения здесь

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

Ответ 2

Решение общей проблемы, когда стороны не являются обычно параллельными осям, может быть проще.

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

Теперь найдите вектор V, перпендикулярный L, который проходит через камеру. Видимое лицо - это тот, который находится под более низким углом к ​​V. Вы можете сравнить углы, используя некоторые кросс-продукты и точечные продукты.

Вы можете упростить это для случая с параллельной осью (поиск L и V тривиален).

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

Для копланарных граней это не имеет значения, потому что никогда не будет скрывать другое.

Для случая с параллельным корпусом должен быть специальный корпус.

Этот алгоритм O (N ^ 2) в числе граней, вам нужно делать попарные сравнения. Использование буфера глубины, поскольку кто-то предложил, может быть более жизнеспособным, если у вас много лиц.