Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Chast_II_Osn_progr_trekhmernoy_grafiki.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
1.83 Mб
Скачать

4. Сводка результатов

Перед рисованием трехмерной сцены надо очистить буфер кадра. Кроме цветового буфера, с кадром может быть связан буфер глубины (z-буфер), позволяющий OpenGL автоматически выполнять удаление скрытых поверхностей.

Все трехмерные объекты в OpenGL формируются из геометрических примитивов нескольких типов: точек, отрезков и многоугольников. Все примитивы задаются в виде упорядоченного множества вершин. Гладкие кривые и поверхности можно аппроксимировать с помощью отрезков и многоугольников. У примитивов можно изменить свойства, влияющие на их отображение на экране: диаметр точек, толщину и стиль отрезков, способ рисования многоугольников. У многоугольников различаются передняя и задняя стороны (по порядку перечисления вершин). Разные стороны можно рисовать разными способами: залитыми, контурными или только вершины.

5. Упражнения

Упражнение 1

Выполните программу 3.1. Добавьте в нее функцию, которая строит из точек диаметром 15 пикселей квадрат заданного размера (например, как на рис. ниже, размер пустых промежутков можно сделать равным радиусу точки). Используйте эту функцию для построения 5-ти квадратов разного цвета с центром в общей точке.

Упражнение 2

Выполните программу 3.2. Затем напишите программу, рисующую каркасный куб в перспективной проекции. Видимые ребра нарисуйте штриховым пунктиром толщиной 3 пиксела, невидимые – точечным пунктиром толщиной 1 пиксел.

Упражнение 3

Выполните программу 3.3. Выясните, что произойдет, если:

  1. убрать вызов функции, которая задает контурное рисование задних сторон многоугольников;

  2. убрать функцию, задающую белый цвет для вершин основания пирамиды;

  3. задать рисование передних сторон контурами, а задних – вершинами.

Упражнение 4

Постройте изображение втулки, аппроксимируя ее поверхность с помощью квадрированных полос (примитивов типа GL_QUAD_STRIP).

Упражнение 5

Разработайте функцию, которая строит сферический сегмент заданной высоты с помощью аппроксимации поверхности сферы треугольниками. В качестве параметров этой функции надо передавать высоту сегмента и число, определяющее степень разбиения сферы. Для рисования передних и задних граней многоугольников используйте разные стили.

Напишите тестовую программу, которая с помощью разработанной функции строит полусферу и позволяет поворачивать ее клавишами курсора (см. программу 3.3).

Лекция 4. Полигональная аппроксимация поверхностей

1. Векторы нормали

Вектором нормали к поверхности в данной точке называется вектор, перпендикулярный этой поверхности. У плоскости векторы нормали направлены одинаково во всех точках, но у произвольной поверхности направления нормали в разных точках могут различаться. Нормаль к аналитически заданной поверхности вычислить несложно, ее направление совпадает с градиентом в данной точке поверхности.

Векторы нормали определяют ориентацию поверхности в пространстве, в частности, расположение относительно источников света. Эти векторы используются OpenGL для расчетов, сколько света получает объект в своих вершинах. Освещение – это отдельная тема, она будет рассматриваться в следующей лекции. Далее кратко описываются способы задания векторов нормали, чтобы вы могли указать их в процессе описания формы объектов.

Нормаль может быть одинаковой в нескольких вершинах. В каких-либо иных точках, кроме вершин, OpenGL задавать вектор нормали не позволяет. Для указания вектора нормали используется одна из функций glNormal*():

void glNormal3{bsidf}(TYPE nx, TYPE ny, TYPE nz);

void glNormal3{bsidf}v( const TYPE* v );

В качестве параметров этой функции передаются координаты нормали. Этот вектор будет присваиваться всем последующим вершинам. Если в разных вершинах направление нормали разное, то надо указывать его перед рисованием каждой вершины, например:

glBegin( GL_POLYGON );

  glNormal3fv( n0 );

  glVertex3fv( v0 );

  glNormal3fv( n1 );

  glVertex3fv( v1 );

  glNormal3fv( n2 );

  glVertex3fv( v2 );

  glNormal3fv( n3 );

  glVertex3fv( v3 );

glEnd();

В каждой точке поверхности существуют два вектора нормали, направленных в противоположные стороны. По умолчанию, нормалью считается вектор, начало которого лежит на передней стороне многоугольника. Вектор нормали указывает только направление, поэтому его длина несущественна. Обычно в качестве нормалей задаются единичные вектора. C помощью вызова glEnable(GL_NORMALIZE) в OpenGL можно включить режим автоматической нормализации векторов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]