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. Для перемещения камеры использовать клавиатуру.


 

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

53270. Програма гуртка «Домашні улюбленці» 154.5 KB
  Як правило, діти люблять домашніх тваринок, сприймають їх як своїх друзів. Проте не завжди відчувають відповідальність за своїх маленьких улюбленців, не мають необхідних знань і навчичок правильного догляду за ними. Є категорія дітей, які не мають домашніх тваринок, проте цікавляться тваринним світом, мріють про маленького друга.
53271. Пори року 248.5 KB
  Тема: Пори року. Мета: Навчальна: вчити дітей називати пори року англійською мовою ознайомити з лексичнограматичною структурою Wht seson is it Розвивальна: розвивати фонематичний слух формувати вміння використовувати міміку жести емоційне забарвлення голоса. Про що Про пори року. Вірно пори року англійською мовою Sesons.
53272. Понятие, классификация и оценка нематериальных активов 18.18 KB
  В соответствии с п.3 ПБУ 14/2000 к нематериальным активам относят имущество, которое одновременно отвечает следующим условиям: 1) не имеет материально-вещественной (физической) структуры
53273. Учет выбытия основных средств. Учет результатов инвентаризации материалов 107.62 KB
  Для определения целесообразности и непригодности объекта основных средств к дальнейшему использованию, невозможности или неэффективности его восстановления, а также для оформления документации на списание указанных объектов в организации приказом руководителя может быть создана постоянно действующая комиссия
53274. Гузелька и Лена на уроке физкультуры 21 KB
  Физрук: Атьдва атьдва атьдва ух мои девчулечки мои красотулечки. бьет по попе девочку она ему пощечину Ф: Двааа. Эх хорошо быть физруком девчулечки не отстаем атьдва атьдваНЕ отстаем свистит в свисток Выбегают 2 девочки. Ф: Выше ноги атьдва атьдва.
53275. Не обміліє пам’яті ріка… 59 KB
  Хід уроку: Слово вчителя: У 2012 році подвигу підпільної організації Молода гвардія чиє життя боротьба та незламна воля завжди були та будуть прикладом для всіх поколінь нашого народу виповнюється 70 років. Тому і перший урок буде присвячений тим хто в роки Великої Вітчизняної війни захищаючи наш край навічно залишився молодим тим хто віддав своє життя заради того щоб сьогодні жили ми. Яскраво й світло майбуття яснилось Та раптом зблідли обрії ясні Війна як привид у життя вселилась І корективи вправила свої....
53276. Гімнастика як дієвий засіб оздоровлення дітей в дошкільному навчальному закладі 163.5 KB
  Ведмежатасилачі молодша група Діти заповзають до зали спираючись на руки та ноги і сідають біля розкладених гир. Сидячи ноги разом руки з гантелями на колінах. Ноги на ширині пліч руки з гантелями біля тулуба пояса. Ноги поставити разом руки з гантелями простягнути перед собою і присідати 5 разів.
53277. EVERYDAY HEALTHY HABITS 107 KB
  Aims:to practice some grammar points (adverbs of frequency, Present Simple, Present Continuous); to ask and answer questions to find out about classmates’ health habits; to give practice in reading a text for specific information; to develop students’ listening skills; to create a relaxed, non-threatening atmosphere in the classroom.
53278. Халдейське царство 45 KB
  Мета: розкрити роль і значення Халдейського царства в історії стародавнього світу, виробляти в учнів уміння аналізувати, спів- ставляти, узагальнювати вивчений матеріал, висловлювати власну думку, розвивати творче мислення школярів, виховувати інтерес до історії найдавніших цивілізацій