Украина, Киев |
Геометрические примитивы в OpenGL
Рисование треугольников
Простейшим многоугольником является треугольник. Примитив GL_TRIANGLES рисует треугольники, соединяя три заданные вершины.
//********************************************************** // Вспомогательный файл для примеров void Prompt() { // Запомнить первоначальное состояние матрицы вращения glPushMatrix(); // Настроить два последовательных поворота // для будущей визуализации сцены glRotatef(xRot, 1.0f, 0.0f, 0.0f);// Первое состояние матрицы вращения glRotatef(yRot, 0.0f, 1.0f, 0.0f);// Следующее состояние // Блок визуализации glBegin(GL_TRIANGLES); glVertex2f(0.0f, 0.0f); // V0 glVertex2f(25.0f, 25.0f); // V1 glVertex2f(50.0f, 0.0f); // V2 glVertex2f(-50.0f, 0.0f); // V3 glVertex2f(-75.0f, 50.0f); // V4 glVertex2f(-25.0f, 0.0f); // V5 glEnd(); // Закончили визуализацию // Восстанавливаем матрицу вращения в исходное состояние glPopMatrix(); }Листинг 21.41. Код рисования двух треугольников в функции Prompt()
то получим такой результат
Обход вершин
Давайте разберемся с понятием порядок обхода ( обход ). В нашем коде порядок следования вершин при формировании треугольников показан на правом рисунке. Для двух треугольников мы его определили разным. Давайте будем считать, как это по умолчанию принято в OpenGL, что если вершины треугольника добавляются в порядке, который при визуализации интерпретируется обходом против часовой стрелки, то это будет его вид спереди ( передняя грань ), иначе мы видим заднюю грань треугольника. Значит треугольник v0-v1-v2 повернут к нам задней стороной, а v3-v4-v5 - передней! (как в "правиле буравчика" для силовых линий постоянного тока).
Обход является признаком для системы, какую сторону представляет соответствующая плоская фигура. Очень часто задним граням нужно приписать: или другие физические характеристики, или вообще сделать невидимыми до поры - до времени, или наделить другими отражательными свойствами и цветом. Постоянно наблюдая за направлением обхода при рисовании вершин многоугольника, можно вовремя определить момент его изменения и поменять характеристики грани.
Если поведение OpenGL по интерпретации обхода по умолчанию нужно изменить на противоположное (по часовой стрелке), следует выполнить команду
glFrontFace(GL_CW);
Параметр GL_CW сообщает OpenGL, что передней гранью нужно считать многоугольники с обходом по часовой стрелке. Чтобу вернуться к обходу по умолчанию (против часовой стрелки), следует указать в той же команде параметр GL_CCW.
Ленты и вееры треугольников
Для представления многих сложных поверхностей и форм приходится рисовать много соединенных треугольников, которые обеспечивают аппроксимацию. Их называют полосами. Рисование полос обеспечивает примитив GL_TRIANGLE_STRIP в функции glBegin(). Схема здесь такая: первый треугольник задается первыми тремя точками, затем каждый новый треугольник добавляется одной вершиной и сочленяется с двумя последними вершинами предыдущего треугольника.
Помимо лент трегольников можно, используя примитив GL_TRIANGLE_FAN в функции glBegin(), создавать вееры треугольников, которые расходятся из центральной точки.