Jump to content

Треугольная полоска

В компьютерной графике полоса треугольника представляет собой подмножество треугольников в треугольной сетке с общими вершинами и является более эффективным методом хранения информации о сетке. Они более эффективны, чем неиндексированные списки треугольников, но обычно одинаково быстры или медленнее, чем индексированные списки треугольников. [1] [2] Основная причина использования полос треугольников — уменьшение объема данных, необходимых для создания серии треугольников. Количество вершин, хранящихся в памяти, уменьшено с 3 N до N + 2 , где N — количество рисуемых треугольников. Это позволяет меньше использовать дисковое пространство , а также ускоряет их загрузку в оперативную память .

Схема четырех треугольников 1, 2, 3 и 4 с вершинами A, B, C, D, E и F.

Например, четыре треугольника на диаграмме без использования полос треугольников пришлось бы хранить и интерпретировать как четыре отдельных треугольника: ABC, CBD, CDE и EDF. Однако, используя полосу треугольников, их можно хранить просто как последовательность вершин ABCDEF. Эта последовательность будет декодирована как набор треугольников с вершинами в ABC, BCD, CDE и DEF, хотя точный порядок чтения вершин не будет соответствовать порядку слева направо, поскольку это приведет к тому, что соседние треугольники будут обращены в чередующихся направлениях. .

реализация OpenGL

[ редактировать ]
Модель двух треугольников, нарисованная в OpenGL с использованием полосок треугольников.

OpenGL имеет встроенную поддержку треугольных полос. Фиксированная функция OpenGL (устарела в OpenGL 3.0) поддерживает треугольные полосы в немедленном режиме и glBegin(), glVertex*(), и glEnd() функции. Более новые версии поддерживают треугольные полосы, используя glDrawElements и glDrawArrays.

Чтобы нарисовать треугольную полосу с использованием немедленного режима OpenGL, glBegin() должен быть передан аргумент GL_TRIANGLE_STRIP, который уведомляет OpenGL о том, что скоро будет нарисована треугольная полоса. glVertex*() Семейство функций определяет координаты каждой вершины в полосе треугольника. Для получения дополнительной информации обратитесь к The OpenGL Redbook. [3]

Чтобы нарисовать полосу треугольника на диаграмме с использованием немедленного режима OpenGL, код выглядит следующим образом:

 //Vertices below are in Clockwise orientation //Default setting for glFrontFace is Counter-clockwise glFrontFace(GL_CW); glBegin(GL_TRIANGLE_STRIP);	 glVertex3f( 0.0f, 0.0f, 0.0f ); //vertex 1 glVertex3f( 0.0f, 0.5f, 0.0f ); //vertex 2 glVertex3f( 0.5f, 0.0f, 0.0f ); //vertex 3 glVertex3f( 1.0f, 0.5f, 0.0f ); //vertex 4 glEnd();

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

Цитирую непосредственно из Руководства по программированию OpenGL :

GL_TRIANGLE_STRIP

Рисует серию треугольников (трехсторонних многоугольников), используя вершины v0, v1, v2, затем v2, v1, v3 (обратите внимание на порядок), затем v2, v3, v4 и так далее. Порядок нужен для того, чтобы все треугольники были нарисованы с одинаковой ориентацией, чтобы полоса могла правильно формировать часть поверхности.

На страницах руководства это еще яснее: [4]

Рисует связную группу треугольников. Для каждой вершины, представленной после первых двух вершин, определен один треугольник. Для нечетного n вершины n , n +1 и n +2 определяют треугольник n . Для четного n вершины n +1 , n и n +2 определяют треугольник n . n – 2 нарисовано треугольника.

Обратите внимание, что n начинается с 1. В приведенном выше примере кода и на диаграмме показаны треугольники, нарисованные по часовой стрелке. Для тех, кого следует считать фронтальными, предыдущий вызов glFrontFace(GL_CW) необходимо, что в противном случае имеет начальное значение GL_CCW (это означает, что треугольники, нарисованные против часовой стрелки, по умолчанию обращены вперед). [5] Это существенно, если glEnable(GL_CULL_FACE) и glCullFace(GL_BACK) уже активны( GL_BACK по умолчанию [6] ), поскольку треугольники, обращенные назад, будут удалены , поэтому не будут рисоваться и вообще не будут отображаться на экране. [7]

Недвижимость и строительство

[ редактировать ]

Из определения следует, что подпоследовательность вершин треугольной полосы также представляет собой треугольную полосу. Однако если эта подполоса начинается с четной (с отсчетом от 1) вершины, то полученные треугольники изменят свою ориентацию. Например, подполоса BCDEF будет представлять треугольники: BCD,CED,DEF.

Аналогично, перестановка вершин полос приведет к тому же набору треугольников, если полоса имеет четное количество вершин. (например, полоса FEDCBA будет представлять собой те же треугольники FED,ECD,DCB,CAB, что и исходная полоса). Однако если полоса имеет нечетное количество вершин, то перевернутая полоса будет представлять собой треугольники с противоположной ориентацией. Например, разворот полосы ABCDE приведет к полосе EDCBA, которая представляет собой треугольники EDC, DBC, CBA).

Преобразование обычной полигональной сетки в одну длинную полосу до недавнего времени было вообще невозможно. Обычно треугольные полосы аналогичны набору реберных петель , а столбы на модели представлены треугольными веерами . Такие инструменты, как Stripe [8] или ФТСГ [9] представить модель в виде нескольких полосок. Оптимальная группировка набора треугольников в последовательные полосы оказалась NP-полной . [10]

Альтернативно, полный объект можно описать как вырожденную полосу , которая содержит треугольники нулевой площади, которые программное или аппаратное обеспечение обработки отбрасывает. Вырожденные треугольники эффективно вносят в полосу разрывы или «скачки». Например, сетку на диаграмме можно также представить как ABCDDFFEDC, что можно интерпретировать как треугольники ABC CBD CDD DDF DFF FFE FED DEC (вырожденные треугольники отмечены курсивом). Обратите внимание, как эта полоса сначала строит два треугольника слева, затем возобновляет работу и строит оставшиеся два справа.

Хотя разрывы в полосах треугольников всегда можно реализовать путем повторной отправки вершин, API иногда явно поддерживают эту функцию. IRIS GL поддерживал Swaps (переворачивание двух последующих вершин в полосе), функцию, на которую опирались ранние алгоритмы, такие как алгоритм SGI . Недавно OpenGL/DirectX может отображать несколько полос треугольников без вырожденных треугольников, используя функцию Primitive Restart.

Трассировка кривой с использованием треугольной полосы
  1. ^ «Архив документации» .
  2. ^ «Жизненные хитрости: раздеваться или не раздеваться» . 31 января 2010 г.
  3. ^ Красная книга OpenGL
  4. ^ «ГлБегин» .
  5. ^ glFrontFace
  6. ^ glCullFace
  7. ^ Часто задаваемые вопросы по OpenGL / 10 Отсечение, отсечение и тестирование видимости
  8. ^ Азанлы, Эльвир. Stripe , получено 28 марта 2007 года.
  9. ^ Сян, Синьюй. FTSG , получено 21 января 2011 г. (ссылка недействительна)
  10. ^ Регина Эстковски, Джозеф С.Б. Митчелл, Синьюй Сян. Оптимальное разложение полигональных моделей на треугольные полосы. В материалах симпозиума по вычислительной геометрии'2002. стр. 254–263 url= http://www.ams.sunysb.edu/~jsbm/papers/p151-mitchell.pdf url= http://portal.acm.org/citation.cfm?id=513431

См. также

[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a8dcb9e7c34954faf72dbf8cd50b040b__1721623080
URL1:https://arc.ask3.ru/arc/aa/a8/0b/a8dcb9e7c34954faf72dbf8cd50b040b.html
Заголовок, (Title) документа по адресу, URL1:
Triangle strip - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)