Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 891 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 20:

Геометрические примитивы в OpenGL

Рисование треугольников

Простейшим многоугольником является треугольник. Примитив GL_TRIANGLES рисует треугольники, соединяя три заданные вершины.

  • Поместите, например, в блок визуализации функции Prompt() следующий код
//**********************************************************
// Вспомогательный файл для примеров
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(), создавать вееры треугольников, которые расходятся из центральной точки.