Як отримати точні результати за допомогою алгоритму Painter?


14

Деякий час тому я запитав, як визначити, коли обличчя перекривається іншим. Порада полягала у використанні Z-буфера.

Однак я не можу використовувати Z-буфер у своєму поточному проекті, і тому я хотів би використовувати алгоритм Painter. Я не маю жодної гадки про те, коли поверхня позаду чи перед іншою, хоча. Я спробував численні методи, але всі вони провалюються у кращих випадках, або вони не вдається навіть у загальних випадках.

Це перелік методів сортування, які я намагався поки що:

  • Відстань до середини кожної особи
  • Середня відстань до кожної вершини кожної грані
  • Середнє z значення кожної вершини
  • Знайдіть значення z вершин кожного обличчя та намалюйте їх першими
  • Найменше z значення вершин кожної грані та намалюйте останні

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

Редагувати: Наприклад, на наступному зображенні поверхня з синьою точкою як середньою точкою намальована поверхнею, а червона точка як середина, тому що синя точка розташована ближче. Однак це тому, що поверхня червоної точки більша, а середина - далі. Поверхня з червоною точкою повинна бути пофарбована над синьою, оскільки вона ближче , тоді як відстань середньої точки говорить про протилежне.

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

Що саме використовується в алгоритмі Painter для визначення порядку, в якому повинні бути намальовані об'єкти?


1
Алгоритм художників просто малює ззаду вперед.
Джонатан Коннелл

1
@ 3nixios: Так, очевидно, але яким чином я можу визначити порядок "назад на фронт"?
pimvdb

1
Усі ваші об'єкти, трикутники або вершини будуть знаходитися на певній відстані від камери, коли ви почнете малювати. Реалізуючи базовий алгоритм (чи вдалося ви?), Було б визначити цю відстань від камери для кожного трикутника та намалювати їх у порядку, що знаходиться найближчим до найближчого. Після того, як це буде зроблено, вам потрібно почати шукати перехрестя і розрізати свої трикутники, це зовсім інша гра з м'ячем . Чому ви вже не можете використовувати Z-Buffer? : P
Джонатан Коннелл

@ 3nixios: Ви абсолютно правильні, але проблема, з якою я стикаюся, - це обчислення відстані. Як я вже зазначив, я спробував кілька методів дистанції, але всі вони не ідеальні. Це замовлення є результатом сортування на відстані середньої точки: i.imgur.com/AcfCm.png .
pimvdb

1
Чи всі ваші багатокутники на звичайній сітці такі? Якщо так, можливо, для покращення цього можуть бути конкретні сітки.
CiscoIPPhone

Відповіді:


14

Зазвичай для z-сортування використовується відстань середньої точки багатокутника до камери. Алгоритм художника за своєю природою не може бути на 100% точним. Завжди знайдуться випадки, коли сортування не вдасться, незалежно від того, яку опорну точку ви використовуєте.

Якщо ви хочете правильного z-сортування за алгоритмом художника, вам доведеться нарізати багатокутники, що перекриваються, на менші частини (наприклад, за допомогою квадрового дерева) і сортувати ці частини окремо. Це може стати досить важким для процесора ..

Знайдено цей файл Powerpoint, який добре ілюструє проблему ( PDF версія ).


Дякую за це Powerpoint, він допоміг мені вирішити проблему.
pimvdb

Посилання розірвано. Хтось може знайти копію?
Keavon

1
@Keavon Відредаговано. Я знайшов робоче посилання на файл.
bummzack

1

У таких випадках для мене завжди працювало за допомогою bsp-дерев. Розділіть сцену, доки у вузлі bsp-дерева не з’явиться опуклий набір полігонів, а потім ви зможете легко сортувати багатокутники по вузлах. Зауважте, що сортування полігонів із вузла bsp-дерева здається такою ж проблемою, як ви описали вище, але існує не така очевидна умова - після побудови bsp-дерева всі проблемні випадки вже вирішені - у вузлі вам слід закінчити набір багатокутників, з яких повинен пройти випробування на опуклість - якщо ви вибираєте площину з одного многокутника з цього набору, решта багатокутників знаходяться перед площиною або позаду площини. Використання цієї інформації полегшує сортування - функтор сортування займає 2 багатокутники - перевірте, у якому напівпросторі - 1-й багатокутник проти 2-го багатокутника, а також перевірте розміщення камери проти другого багатокутника.

Зауважимо також, що тести визначення сторони розміщення камери щодо багатокутників та обходу bsp-дерева дещо відрізняються при ортографічному та перспективному проектуванні.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.