Разделение вогнутого многоугольника (панель о) на набор треугольников (панель 6) приводит к изображению сторон треугольников (пунктирные линии), из которых состоит исходный многоугольник

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

Чтобы с помощью стандартных процедур OpenGL изобразить вогнутый многоугольник, его сначала нужно разделить на набор выпуклых многоугольников. Как правило, вогнутый многоугольник делится на набор треугольников с помощью методов, описанных в разделе 3.15. После этого вогнутый многоугольник изображается как закрашенная фигура. Аналогично, если требуется показать только вершины многоугольника, отображаются вершины треугольников. Отметим, что для того, чтобы изобразить исходный вогнутый многоугольник в виде контура, нельзя просто задать режим изображения как GL_LINE, поскольку при этом будут изображаться все стороны треугольников, из которых состоит исходный вогнутый многоугольник (рис. 4.33).

К счастью, в пакете OpenGL есть механизм, который позволяет удалять выделенные стороны с контурного изображения. Каждая вершина многоугольника записывается с однобитовым флагом, который сообщает о том, соединена ли эта вершина со следующей вершиной граничной стороной многоугольника. Таким образом, все, что нам нужно, - это перевести этот флаг в положение “выключено”, и тогда сторона, следующая за этой вершиной, изображаться не будет. Флаг для стороны устанавливается с помощью следующей функции.

glEdgeFlag (flag); Чтобы показать, что за вершиной нет граничной стороны, параметру flag присваивается значение константы OpenGL GL_FALSE. Этот подход применяется ко всем последовательно задаваемым вершинам до следующего вызова функции glEdgeFlag. Константа OpenGL GL_TRUE возвращает флаг в исходное положение, которое устанавливается по умолчанию. Отметим, что функция glEdgeFlag может помещаться внутри пары glBegin/glEnd. В качестве иллюстрации применения флагов сторон приведен следующий фрагмент программы, в котором изображаются только две стороны заданного треугольника (рис. 4.34).

Треугольник (панель а) можно изобразить таким образом, как показано на панели б, присвоив флагу стороны для вершины у2 значение СЬ_РАЬЗЕ и предполагая, что вершины задаются в направлении против часовой стрелки

Рис. 4.34. Треугольник (панель а) можно изобразить таким образом, как показано на панели б, присвоив флагу стороны для вершины у2 значение СЬ_РАЬЗЕ и предполагая, что вершины задаются в направлении против часовой стрелки

glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); glBegin (GL_POLYGON); glVertex3fv (vl); glEdgeFlag (GL_FALSE); glVertex3fv (v2); glEdgeFlag (GL_TRUE); glVertex3fv (v3); glEnd ( ); Флаги сторон многоугольников также задаются как массивы, которые можно объединять или связывать с массивом вершин (разделы 3.17 и 4.3). Существуют такие операторы создания массива флагов.

glEnableClientState (GL_EDGE_FLAG_ARRAY); glEdgeFlagPointer (offset, edgeFlagArray); Параметр offset показывает количество битов между значениями флагов сторон в массиве edgeFlagArray. По умолчанию значение параметра offset равно 0.


⇐ вернуться назад | | далее ⇒