Получите z глубину от 4 вершин грани - PullRequest
1 голос
/ 21 сентября 2009

Как я могу z-упорядочить грани трехмерного объекта, используя только 4 вершины каждой из его граней? Я попытался использовать z-буфер, где я храню среднее значение z каждого лица; это прекрасно работает в большинстве случаев, но терпит неудачу, когда у объекта есть большие и маленькие лица.

Я создаю небольшой 3d-движок во флэш-памяти, просто для удовольствия в обучении, поэтому у меня есть только эти 4 вершины и норма лица.

Спасибо!

Ответы [ 3 ]

1 голос
/ 21 сентября 2009

Вы сталкиваетесь с проблемой видимости , и нет простого ответа. Эта страница описывает проблему более подробно и может дать вам некоторые мысли. Способ, с помощью которого «настоящие» 3D-движки решают эту проблему, заключается в том, что они рисуют сцену попиксельно, и они отслеживают координаты Z самого верхнего объекта, нарисованного до настоящего момента. Этот подход недоступен для нас во Flash, поэтому лучшее, что мы можем сделать, это приблизительное или обобщенное.

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

0 голосов
/ 05 декабря 2009

Другой подход, который довольно просто реализовать, - это BSP-деревья . Единственная проблема в том, что в 3D он имеет довольно плохие характеристики производительности в худшем случае. Обычно вы поражаете его лишь некоторыми довольно странными случаями, так что, возможно, стоит попробовать и посмотреть, как это работает в вашем случае.

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

0 голосов
/ 21 сентября 2009

Z-буферизация работает лучше всего, когда все грани примерно одинакового размера. Если у вас есть что-то, что намного больше остальных, то они «перезапишут» меньшие, давая вам артефакты.

Единственное решение - разбить большие грани на более мелкие, которые ближе к среднему размеру.

...