Глубина сортировки прямоугольных многоугольников, все части осей модели
Я работаю над некоторой графикой рендеринга, у меня есть такая модель, я использую инструменты для холста 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) в числе граней, вам нужно делать попарные сравнения. Использование буфера глубины, поскольку кто-то предложил, может быть более жизнеспособным, если у вас много лиц.