14569

Введение в OpenGL. Рисование простейших геометрических объектов. Работа с OpenGL при помощи GLUT

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

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

Лабораторная Работа № 1 Введение в OpenGL. Рисование простейших геометрических объектов. Работа с OpenGL при помощи GLUT. 1. Что такое GLUT OpenGL является мультиплатформенной библиотекой т.е. программы написанные с помощью OpenGL можно легко переносить на различные операц...

Русский

2013-06-08

78.5 KB

22 чел.

Лабораторная Работа № 1

Введение в OpenGL.  Рисование простейших геометрических объектов.

Работа с OpenGL при помощи GLUT.

1. Что такое GLUT? 

OpenGL является мультиплатформенной библиотекой, т.е. программы написанные с помощью OpenGL можно легко переносить на различные операционные системы, при этом получая один и тот же визуальный результат. Единственное что плохо - это то, что для конкретной операционной системы необходимо по своему производить настройку OpenGL. То есть, допустим, вы написали OpenGL программу под Windows и захотели перенести её в Linux, код OpenGL должен перенестись без проблем, но вот операции с окнами, интерфейс управления, операции с устройствами ввода/вывода нужно заново переписать уже под другую операционную систему - Linux.

К счастью, существует специальная мультиплатформенная библиотека, позволяющая решить вышеописанные проблемы. И называется эта библиотека - GLUT.

1. Основные шаги для построения минимальной программы 

Прежде всего необходимо научиться самому основному - это созданию окна, в котором можно будет рисовать с помощью OpenGL. Минимальная программа, которая создает окно и что-нибудь рисует там состоит из следующих шагов:

  1.  Инициализация GLUT
  2.  Установка параметров окна.
  3.  Создание окна.
  4.  Установка функций, отвечающих за рисование в окне и изменении формы окна.
  5.  Вход в главный цикл GLUT.

Итак, рассмотрим все 5 пунктов поподробнее:

1. Инициализация GLUT производится командой

void glutInit(int *argcp, char **argv); 

Первый параметр представляет из себя указатель на количество аргументов в командной строке, а второй - указатель на массив аргументов. Обычно эти значения берутся из главной функции программы: int main(int argc, char *argv[]).

2. Установка параметров окна содержит в себе несколько этапов. Прежде всего необходимо указать размеры окна:

void glutInitWindowSize(int width, int height);

Первый параметр width - ширина окна в пикселях, второй height - высота окна в пикселях. Отмечу также, что если эту команду опустить, то GLUT сам установит размеры окна по умолчанию, обычно это 300x300.

Далее можно задать положение создаваемого окна относительно верхнего левого угла экрана. Делается это командой:

void glutInitWindowPosition(int x, int y);

Необходимо также установить для окна режим отображения информации. Т.е. установить для окна такие параметры как: используемая цветовая модель, количество различных буферов, и т.д. Для этого в GLUT существует команда:

void glutInitDisplayMode(unsigned int mode); 

У команды имеется единственный параметр, который может быть представлен одной из следующих констант или комбинацией этих констант с помощью побитового ИЛИ.

Константа

Значение

GLUT_RGB

Для отображения графической информации используются 3 компоненты цвета RGB.

GLUT_RGBA

То же что и RGB, но используется также 4 компонента ALPHA (прозрачность).

GLUT_INDEX

Цвет задается не с помощью RGB компонентов, а с помощью палитры. Используется для старых дисплеев, где количество цветов например 256.

GLUT_SINGLE

Вывод в окно осуществляется с использованием 1 буфера. Обычно используется для статического вывода информации.

GLUT_DOUBLE

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

GLUT_ACCUM

Использовать также буфер накопления (Accumulation Buffer). Этот буфер применяется для создания специальных эффектов, например отражения и тени.

GLUT_ALPHA

Использовать буфер ALPHA. Этот буфер, как уже говорилось используется для задания 4-го компонента цвета - ALPHA. Обычно применяется для таких эффектов как прозрачность объектов и антиалиасинг.

GLUT_DEPTH

Создать буфер глубины. Этот буфер используется для отсечения невидимых линий в 3D пространстве при выводе на плоский экран монитора.

GLUT_STENCIL

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

GLUT_STEREO

Этот флаг используется для создания стереоизображений. Используется редко, так как для просмотра такого изображения нужна специальная аппаратура.

Вот пример использования этой команды:void glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); 

3. Создание окна. После того как окно установлено необходимо его создать.

int glutCreateWindow(const char *title);  

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

4. Установка функций, отвечающих за рисование в окне и изменении формы окна.

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

void glutDisplayFunc(void (*func)(void));

Единственный параметр этой функции - это указатель на функцию, которая будет отвечать за рисование в окне. Например чтобы функция void Draw(void), определенная в вашей программе отвечала за рисование в окне, надо присоединить ее к GLUT следующим образом: glutDisplayFunc(Draw);

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

void glutReshapeFunc(void (*func)(int width, int height));

Единственный параметр - это указатель на функцию, отвечающую за изменение размеров окна, которая как видно должна принимать два параметра width и height, соответственно ширина и высота нового (измененного) окна.

5. Вход в главный цикл GLUT.

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

void glutMainLoop(void);

Вот в принципе основные шаги для самой простейшей GLUT программы. Теперь я приведу эту самую программу. Как вы сейчас убедитесь - это очень легкая программа и трудного тут ничего нет.

Наконец, glFlush() гарантирует, что команда рисования будет выполнена немедленно,  а не сохранена в буфере.

И ещё, прежде чем использовать функции из GLUT необходимо к программе подключить заголовок: #include <GL/glut.h.

Создание консольного приложения, использующего OpenGL

Самым простым объектом, с помощью которого можно увидеть всю мощь OpenGL, является сфера. Давайте попытаемся ее изобразить. Для этого надо создать новый проект в VisualC++, выполните следующие действия:

  1.  Запустите MSVisualC++6.0
  2.  Щелкните меню File->New->Win32 Console Application.
  3.  Выберете каталог и имя проекта, впишите - sphere, щелкните OK.
  4.  Выберете An Empty Project, щелкните Finish.
  5.  Создайте в проекте файл  sphere.c
  6.  Щелкните Build->Set Active Configuration и установите тип проекта sphere - Win32 Release
  7.  Далее, щелкайте Project->Settings->Link->Object/library modules и добавьте туда opengl32.lib, glut32.lib.
  8.  Теперь откомпилируйте и запустите Вашу программу.
    Меню Build->Execute Sphere.exe


#include <windows.h>

#include <GL/gl.h>

#include <GL/glu.h>

#include <GL/glaux.h>

#include <GL/glut.h>

void resize(int width,int height)

{

}    

void  display(void)

{

  glColor3d(1,1,0);

glutSolidTeapot(2);

          glFlush();

  

}

void init(void)

{

    glEnable(GL_COLOR_MATERIAL);

    glEnable(GL_LIGHTING);

    glEnable(GL_LIGHT0);

    glEnable(GL_DEPTH_TEST);

    glClearColor (0.0, 0.0, 0.0, 0.0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   glMatrixMode( GL_PROJECTION );

   glLoadIdentity();

   glOrtho(-5.0,5.0,-5.0,5.0,2.0,12.0);   

  gluLookAt( 0,0,5, 0,1,0, 0,1,0 );

   glMatrixMode( GL_MODELVIEW);

}

int main(int argc,char ** argv)

{

 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

 glutInitWindowPosition(50,10);

 glutInitWindowSize(400,400);

 glutCreateWindow("Hello");

 glutReshapeFunc(resize);

 init();

  glutDisplayFunc(display);

 glutMainLoop();

 return 0;

 }

Рис.1. Код программы рисования сферы – sphere.c

Синтаксис команд OpenGl

 Командами в OpenGl называются функции или процедуры. Для их описания используется следующий синтаксис:

type glCommand_name[1 2 3 4][b s i f d ub us ui][v](type1 arg1,-,typeN argN)

Gl-это имя библиотеки, в которой описана эта функция:
для базовых функций OpenGL, функций из библиотек GLU, GLUT, GLAUX это gl, glu, glut, aux соответственно.

Command_name  имя команды
[1 2 3 4]число аргументов команды
[b s i f d ub us ui ]тип аргумента:

Доступны следующие типы:

  •  b - GLbyte байт
  •  s - GLshort короткое целое
  •  i - GLint целое
  •  f - GLfloat дробное
  •  d - GLdouble дробное с двойной точностью
  •  ub - GLubyte беззнаковый байт
  •  us - GLushort беззнаковое короткое целое
  •  ui - GLuint беззнаковое целое
  •  v - массив из n параметров указанного типа

[v] наличие этого символа показывает, что в качестве параметров функции используется указатель на массив значений

Символы в квадратных скобках в некоторых названиях не используются. Например, команда glVertex2i() описана как базовая в библиотеке OpenGL, и использует в качестве параметров два целых числа, а команда glColor3fv() использует в качестве параметра указатель на массив из трех вещественных чисел.

     В нашем случае, glColor3d означает, что в функцию передаются три параметра типа GLdouble. Также можно было вызвать glColor3i, т.е. три параметра типа GLint. Если тип параметров короткое целое, целое, байт или длинное, то компонент цвета приводится к диапазону [0,1]. Приведение к этому диапазону осуществляется следующим образом. В случае беззнакового типа наибольшее возможное значение приводится к единице, ноль к нулю. В случае знакового типа максимальное значение приводится к единице или к минус единице, а минус единица будет приведена к единице. На практике вы будете пользоваться одним из трех случаев, рассмотренных в качестве примера ниже. Например, для беззнакового байта приведение будет осуществлено по следующей формуле: значение_переменной_хранимой_в_байте/255, т.к. 255 максимальное число, хранимое в одном байте. Функция glColor3dv означает, что в качестве параметров передается массив из трех элементов типа GLdouble. Например:

double array[] = {0.5, 0.75, 0.3, 0.7};

...

glColor3dv(array);

glColor3ub(200,100,0);   // приводится к 200/256, 100/256, 0,256

glColor3d(0.25,0.25,0);  // темно-желтый

glColot3ub(0,100,0);     // темно-зеленый

glColor3ub(0,0,255);     // синий

     Функция glutSolidSphere - рисует сферу в начале координат и единичным радиусом.

Задание на лабораторную работу

1. Ввести и отладить программу, приведенную на рис.1.

2.Замените функцию glutSolidSphere на функцию, из указанных ниже с соответсвующими параметрами. Значения параметров устанавливайте порядка единицы - 0.5-1.7. Если вы укажете слишком маленький размер, фигуру будет плохо видно; если слишком большой, то она получится урезанной. Это связано с тем, что ее край, как бы вылезет из монитора.

  •  glutSolidCube(width) // куб
  •  glutSolidTorus(r,R) // тор
  •  glutSolidCylinder(r,height) // цилиндр
  •  glutSolidCone(r,height) // конус
  •  glutSolidIcosahedron(width) // многогранники
  •  glutSolidOctahedron(width)
  •  glutSolidTetrahedron(width)
  •  glutSolidDodecahedron(width)
  •  glutSolidTeapot(width) // рисует чайник

3. С помощью вышеуказанных функций нарисовать проволочные фигуры, заменив и именах функций  Solid на  Wire.
Пример:

       glutWireCube(1) // рисует проволочный куб

Прототипы функций, используемых в лабораторной работе.

void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
void
glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);

void glutWireCube(GLdouble size);
void
glutSolidCube(GLdouble size);

void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint
nsides, GLint rings);
void
glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius,
GLint
nsides, GLint rings);

void glutWireIcosahedron(void);
void
glutSolidIcosahedron(void);

void glutWireOctahedron(void);
void
glutSolidOctahedron(void);

void glutWireTetrahedron(void);
void
glutSolidTetrahedron(void);

void glutWireDodecahedron(GLdouble radius);
void
glutSolidDodecahedron(GLdouble radius);

void glutWireCone(GLdouble radius, GLdouble height, GLint slices,
GLint
stacks);
void
glutSolidCone(GLdouble radius, GLdouble height, GLint slices,
GLint
stacks);

void glutWireTeapot(GLdouble size);
void
glutSolidTeapot(GLdouble size);


 

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

1514. Принципы работы в основных компьютерных программах Microsoft 478 KB
  Система MIKROSOFT OUTLOOK, в планировании работ и событий. Текстовый редактор MICROSOFT WORD, в организации документоведения. Система Microsoft Exel. Работа с электронными таблицами. Создание презентаций в системе Ms Power Point.
1515. Звіт про виконання лабораторних робіт з дисципліни економічної інформатики 38.22 KB
  Моделювання математичних процесів. Моделювання обчислень в економічних задачах табличного вигляду. Кругові графіки. Моделювання циклічних процесів.
1516. Проект одноступенчатого редуктора для электродвигателя марки А100S2У3 28.75 KB
  Номинальные частоты вращения и угловые скорости редуктора. Делительный диаметр червячного колеса. Предварительный Расчет валов редуктора и конструирование червяка и червячного колеса. Конструкционные размеры корпуса редуктора.
1517. Расчет зоны покрытия и абонентской нагрузкидля базовой станции стандарта GSM 77.97 KB
  Расчет зоны покрытия БС с помощью модели Хата. Расчет нагрузки в соте. Вероятность отказа в обслуживании сотой абонента в зависимости от количества каналов.
1518. Базовая структура системы автоматического управления приводным двигателем постоянного тока 111.02 KB
  Выбор электродвигателя. Выбор силового преобразователя. Выбор сглаживающего дросселя. Определение коэффициентов передачи и постоянных времени силовых элементов. Компоновка и расчет статики САУ. Построение функциональной схемы САУ. Расчет статических характеристик САУ. Выбор элементов САУ и расчет параметров обратных связей.
1519. Организация рабочего места оператора персонального компьютера 128.31 KB
  Представить схему расположения рабочих мест, оснащенным персональными компьютерами, для заданного помещения. Требования к освещению рабочего места. Требования к микроклимату на рабочем месте. Оптимальные величины показателей микроклимата на рабочих местах производственных помещений. Время регламентированных перерывов в течение рабочей смены.
1520. Экономика предприятия. Шпаргалка. Основные фонды 178.18 KB
  Понятие, состав и структура основных фондов предприятия. Виды стоимости основных фондов. Методы начисления амортизации основных фондов. Факторы и направления повышения эффективности использования материальных ресурсов. Взаимосвязь объема производства, себестоимости и выручки. (Аналитическое и графическое определение точки безубыточности.)
1521. Проблема человека в конфуцианстве. Человек и природа в чань-буддизме 157 KB
  Место человека в конфуцианстве. Низкий человек и благородный муж. Толкование человеческой природы Мэн-цзы и Сунь-цзы. Современное конфуцианство Чэнь Юланя. Учение о человеке в Чань-буддизме.
1522. Патриархально-патерналистская концепция государства Конфуция 32.92 KB
  Социально-политические представления древневосточных обществ. Конфуцианское решение проблемы. Самая краткая формулировка учения Конфуция. Изначальное значение понятия порядок (ли) как нормы конкретных отношений, действий, прав и обязанностей в эпоху династии Западных Чжоу.