Два трехмерных треугольника, метод определения z-порядка (графика) - PullRequest
0 голосов
/ 06 мая 2018

Я искал ответ на этот вопрос буквально месяц. У меня есть два 3D-треугольника, координаты для каждого. Они могут быть в любой ориентации и положении, но не пересекаются. У меня тоже есть камера в том же 3D пространстве. Теперь я просто хочу выяснить, как я и предполагал, с помощью Алгоритма Художника, какой из треугольников является infront, иначе. какой я должен нарисовать второй.

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

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

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

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

После этого нам нужно поставить координату камеры в то же уравнение, чтобы мы знали, находится ли камера впереди или сзади от контрольного треугольника. Базовая плоскость / треугольник теперь находится на нулевом расстоянии, другой треугольник на расстоянии d , а камера находится на расстоянии c . Если знаки c и d совпадают, базовая плоскость является самой дальней.

Однако, как указал DavidE, два непересекающихся треугольника не обязательно удовлетворяют этому условию. Когда другой заказ тоже не выполняется, нужно найти разделительную плоскость.

enter image description here

IMO это может быть достигнуто путем проверки еще до 9 кандидатов в базовую плоскость: выберите две вершины (то есть ребро) из треугольника A и одну вершину из треугольника B в качестве кандидата в качестве разделяющей плоскости. Теперь оставшаяся вершина из треугольника A должна находиться на другой стороне относительно исходной плоскости-кандидата, чем две оставшиеся вершины треугольника B. В этой конфигурации два кандидата из 9 образуют разделительную плоскость. По симметрии, возможно, нужно попробовать и другие 9 комбинаций (взяв одно ребро за раз из B и одну вершину из A).

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

0 голосов
/ 06 мая 2018

Достаточно найти плоскость, которая разделяет два треугольника. Тогда треугольник впереди - тот, что на той же стороне плоскости, что и камера.

Построение классификатора максимального запаса даст вам такую ​​плоскость.

...