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

4. Плоскости отсечения

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

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

Рис. 4.3. Дополнительные плоскости отсечения и видимый объем.

Для задания плоскости отсечения применяется функция:

void glClipPlane( GLenum plane, const double* equation );

Указатель equation указывает на массив из 4-х коэффициентов уравнения плоскости . Параметр plane равен GL_CLIP_PLANEi, где i – это целое число от 0 до 5, обозначающее одну из 6-ти возможных плоскостей отсечения. При выполнении отсечения будут оставлены только те вершины , для которых выполняется условие:

,

где M – это видовая матрица на момент вызова функции glClipPlane().

Каждую из плоскостей отсечения надо включить с помощью вызова:

glEnable( GL_CLIP_PLANEi );

Для выключения плоскости надо вызвать:

glDisable( GL_CLIP_PLANEi );

В программе 4.4 демонстрируется применение плоскостей отсечения для рисования каркасного сферического сегмента объемом в четверть сферы (рис. 4.4).

Рис. 4.4. Сегмент каркасной сферы, построенный с помощью плоскостей отсечения.

#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

void CALLBACK resize( int width, int height );

void CALLBACK display();

void main()

{

  auxInitDisplayMode( AUX_SINGLE | AUX_RGBA );

  auxInitPosition( 0, 0, 400, 400 );

  auxInitWindow( "Лекция 4, Программа 4.4" );

  auxReshapeFunc( resize );

  auxMainLoop( display );

}

void CALLBACK resize( int width, int height )

{

  glViewport( 0, 0, width, height );

  glMatrixMode( GL_PROJECTION );

  glLoadIdentity();

  gluPerspective( 60.0, (float)width/(float)height, 1.0, 20.0 );

  glMatrixMode( GL_MODELVIEW );

  glLoadIdentity();

}

void CALLBACK display()

{

  double eqn1[4] = {0.0, 1.0, 0.0, 0.0}; // y < 0

  double eqn2[4] = {1.0, 0.0, 0.0, 0.0}; // x < 0

  glClear( GL_COLOR_BUFFER_BIT );

  glColor3d( 1.0, 1.0, 1.0 );

  glPushMatrix();

  glTranslated( 0.0, 0.0, -5.0 );

  glClipPlane( GL_CLIP_PLANE0, eqn1 );

  glEnable( GL_CLIP_PLANE0 );

  glClipPlane( GL_CLIP_PLANE1, eqn2 );

  glEnable( GL_CLIP_PLANE1 );

  glRotated( 90.0, 1.0, 0.0, 0.0 );

  auxWireSphere( 1.0 );

  glPopMatrix();

  glFlush();

}

Программа 4.4. Использование плоскостей отсечения для построения

каркасного сферического сегмента.

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

Произвольную гладкую поверхность можно аппроксимировать с помощью сетки из многоугольников, например, из треугольников. Чтобы полигональная аппроксимация поверхности выглядела похожей на требуемую поверхность, в OpenGL необходимо задавать нормали в вершинах полигональной сетки. Направление нормалей учитывается при вычислении количества света, отраженного поверхностью в окрестности вершины по направлению наблюдателя.

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

В OpenGL можно наложить ограничения на форму видимого объема. Для этого используются дополнительные плоскости отсечения.

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