14573

Модель разноцветного куба. Способы получения плоских проекций трехмерных объектов. Задание положения и ориентации камеры

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №4 Модель разноцветного куба. Способы получения плоских проекций трехмерных объектов. Задание положения и ориентации камеры. 1.Рисование трехмерного куба. Куб следует рассматривать как шесть многоугольников которые определяют его грани. Мас

Русский

2013-06-08

81.5 KB

9 чел.

Лабораторная работа №4

Модель разноцветного куба.  Способы получения плоских проекций трехмерных объектов. Задание положения и ориентации камеры.

1.Рисование трехмерного куба.

Куб следует рассматривать как шесть многоугольников, которые определяют его грани. Массив вершин куба может быть представлен в следующем виде:

GLfloat vertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},

{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},

{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};

Для определения граней куба можно использовать список точек- элементов массива вершин. Например, одна грань куба в тексте программы определяется следующим образом:

glBegin(GL_POLYGON);

glVertex3fv(vertices[0]);

glVertex3fv(vertices[3]);

glVertex3fv(vertices[2]);

glVertex3fv(vertices[1]);

glEnd();

 Другие пять граней определяются аналогично. При определении трехмерных многогранников порядок перечисления вершин имеет большое значение. Следует учитывать, что многоугольник имеет две стороны- внутреннюю и внешнюю. Будем называть грань внешней, если при взгляде  с внешней стороны объекта на эту грань ее вершины «обходятся» против часовой стрелки. Этот метод известен как «правило правой руки», поскольку, если расположить четыре согнутых пальца павой руки вдоль направления обхода контура, большой палец будет указывать наружную сторону грани.

Список вершин можно использовать и для хранения информации, необходимой для раскрашивания куба. С вершинами в данном примере будут ассоциироваться чистые цвета вершин цветового куба (черный, белый, красный, зеленый, синий, голубой, фиолетовый, желтый):

GLfloat colors[][3]={{0.0,0.0,0.0},{1.0,0.0,0.0},

{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},

{1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}};

 Для управления режимом интерполяции цветов используется команда void glShadeModel(GLenummode) вызов которой с параметром GL_SMOOTH включает интерполяцию (установка по умолчанию), а с GL_FLAT отключает.

Функция quad() вычерчивает четырехугольник, заданный точками в списке вершин, а функция colorcube() задает шесть граней таким образом, чтобы все они были внешними.

GLfloat vertices[][3]={{-1.0,-1.0,-1.0},{1.0,-1.0,-1.0},

{1.0,1.0,-1.0},{-1.0,1.0,-1.0},{-1.0,-1.0,1.0},

{1.0,-1.0,1.0},{1.0,1.0,1.0},{-1.0,1.0,1.0}};

GLfloat colors[][3]={{0.0,0.0,0.0},{1.0,0.0,0.0},

{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},

{1.0,0.0,1.0},{1.0,1.0,1.0},{0.0,1.0,1.0}};

void polygon(int a, int b, int c, int d)

{

glBegin(GL_POLYGON);

glColor3fv(colors[a]);

glVertex3fv(vertices[a]);

glColor3fv(colors[b]);

glVertex3fv(vertices[b]);

glColor3fv(colors[c]);

glVertex3fv(vertices[c]);

glColor3fv(colors[d]);

glVertex3fv(vertices[d]);

glEnd();

}

void colorcube()

{

polygon(0,3,2,1);

polygon(2,3,7,6);

polygon(0,4,7,3);

polygon(1,2,6,5);

polygon(4,5,6,7);

 polygon(0,1,5,4);

}

Проективные преобразования в OpenGL

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

Перспективные преобразования в OpenGL

Параметры пирамиды видимости задаются функцией glFrustum(), смысл аргументов которой поясняет рис.4.1.

 

Рис.4.1.

void glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); 

Значения аргументов near и far, задающих положение передней и задней отсекающих плоскостей, должны быть положительными  и отсчитываться от  центра проецирования вдоль оси проецирования.

Поскольку матрица проецирования умножается на текущую матрицу, сначала нужно задать режим работы с этой матрицей. Типичная последовательность операций представлена ниже.

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum(xmin, xmax, ymin, ymax, near, far);

Во многих приложениях предпочтительнее задавать не линейные параметры, характеризующие положение углов усеченной пирамиды видимости, а угол и поле зрения. Однако, если картинная плоскость является прямоугольником, а не квадратом, то нужно задавать пару углов зрения: один в вертикальной плоскости, другой- в горизонтальной (рис.4.2).

Рис.4.2.

  void gluPerspective(GLdouble fovy, GLdouble aspect,
GLdouble
near, GLdouble far); 

Аргументы этой функции имеют следующий смысл:

  •  fovy- угол зрения в вертикальной плоскости;
  •  aspect- отношение ширины окна картинной плоскости к его высоте;
  •  near и far- расстояние от центра проецирования до передней и задней отсекающих плоскостей.

Параллельное проецирование в OpenGL

В составе OpenGL имеется только одна функция для задания параметров параллельного проецирования, которая формирует ортогональную проекцию. Зона видимости при этом превращается в параллелепипед (рис.4.3.)

Рис.4.3.

void glOrtho(GLdouble left, GLdouble right, GLdouble bottom,
GLdouble
top, GLdouble near, GLdouble far);

Аргументы вызова имеют тот же геометрический смысл, что и одноименные аргументы функции glFrustum().

Задание положения и ориентации камеры.

В составе OpenGL имеется функция gluLookAt(), которая позволяет задать положение и ориентацию камеры (рис.4.4).

Рис 4.4.

void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz); 

Аргументы функции имеют следующий вид:

  •  eyex, eyey, eyez – координаты точки наблюдения;
  •  centerx, centery, centerz - координаты контрольной точки объекта, указывающей центр сцены;
  •  upx, upy, upz- компоненты точки, которая задает положительное направления оси Y сцены.

 Порядок выполнения работы

  1.  Составить программу рисования куба.
  2.  Получить перспективную и параллельную проекцию куба.
  3.  Организовать перемещение камеры вокруг куба, изменяя координаты точки наблюдения – eyex, eyey, eyez. Для перемещения камеры использовать клавиатуру.


 

А также другие работы, которые могут Вас заинтересовать

62112. Повторение на уроках истории в дореволюционной школе 42.49 KB
  Необходимо постоянное классное повторение ил урока в урок всего самого первостепенного самого существенного что позволит ученикам видеть в истории нечто целое. Повторение это не механическое воспроизведение изученного...
62113. Позакласна робота з інформатики 36.59 KB
  Можна виділити основні вимоги до організації позакласної роботи в школі: залучення до позакласної діяльності учнів з урахуванням їхніх інтересів і здібностей; органічна єдність навчальної і позакласної діяльності...
62116. Анализ финансовой отчетности. Методические рекомендации 89.96 KB
  Признаки хорошего баланса: 1 валюта баланса в конце отчетного периода должна увеличиваться по сравнению с началом периода; 2 темпы прироста оборотных активов должны быть выше чем темпы прироста внеоборотных активов; 3 собственный капитал предприятия должен...
62117. Цивилизация Древней Руси (6 – н. 12 вв.) 30 KB
  Версии образования древнерусской государственности и особенности раннефеодальной монархии работа с термином государство доклады дискуссия. Социальная структура общества доклады работа с источником...
62119. Методы отказа от курения. Выявление степени никотиновой зависимости (тест Фагестрема), мотивации к отказу от курения, мотивации к курению (тест Хорна) 40.47 KB
  Табакокурение является одной из самых распространенных и значительных бытовых вредностей, а табачная интоксикация является одним из этиологических факторов большого числа расстройств и заболеваний...