
- •Содержание
- •Введение
- •1 Лабораторная работа №1 opengl и графические примитивы
- •1.1 Теоретические положения
- •1.1.1 Структура OpenGl-проекта
- •1.1.2 Работа с графическими примитивами
- •1.1.2.1 Точки
- •1.1.2.2 Линии
- •1.1.2.3 Треугольники
- •1.1.2.4 Четырехугольники и многоугольники
- •1.1.2.5 Массивы вершин и цветов
- •1.1.2.6 Область вывода
- •1.2 Практика
- •1.2.1 Общее задание
- •1.2.2 Варианты индивидуального задания
- •2 Лабораторная работа №2 Матрицы и геометрические преобразования
- •2.1 Теоретические положения
- •2.1.1 Системы координат OpenGl
- •2.1.2 Видовые преобразования
- •2.1.3 Ориентация
- •2.1.4 Трехмерные примитивы
- •2.2 Практика
- •2.2.1 Общее задание
- •2.2.2 Варианты индивидуального задания
- •3 Лабораторная работа №3 Проекции, источники света, материалы
- •3.1 Теоретические положения
- •3.1.1 Виды плоских проекций
- •3.1.1.1 Ортографическая проекция
- •3.1.1.2 Одноточечная перспективная проекция
- •3.1.2 Освещение объектов
- •3.1.2.1 Нормали и грани
- •3.1.2.2 Материалы
- •3.1.2.3 Источники света
- •3.1.2.3 Модели освещения и затенения
- •3.2 Практика
- •3.2.1 Общее задание
- •3.2.2 Варианты индивидуального задания
- •4 Лабораторная работа №4 Отсечение и прозрачность
- •4.1 Теоретические положения
- •4.1.1 Принадлежность пикселей контексту воспроизведения
- •4.1.2 Отсечение
- •4.1.3 Прозрачность
- •4.2 Практика
- •4.2.1 Общее задание
- •5 Лабораторная работа №5 Трафареты и глубина
- •5.1 Теоретические положения
- •5.1.1 Трафарет
- •5.1.2 Глубина
- •5.2 Практика
- •5.2.1 Общее задание
- •6 Лабораторная работа №6 Текстуры
- •6.1 Теоретические положения
- •6.1.2 Загрузка графического файла в память
- •6.1.3 Создание имени-идентификатора текстуры
- •6.1.4 Установка идентификатора в активное положение
- •6.1.5 Создание текстуры в памяти
- •6.1.6 Установка параметров текстуры
- •6.1.7 Установка параметров взаимодействия текстуры с объектом
- •6.1.8 Связывание координат текстуры с объектом
- •6.2 Практика
- •6.2.1 Общее задание
- •7 Список литературы
- •Приложение а
- •Приложение б шаблон opengl-проекта «basis»
- •Приложение в Синтаксис команд и типы данных OpenGl
- •Приложение г Пример двумерного рисунка
- •Приложение д Положение источников света
2.1.4 Трехмерные примитивы
С помощью команд из библиотеки GLAUX можно строить трехмерные объекты заданного размера (см. табл. 2.3). Команды представлены в двух вариантах: Solid – рисование сплошного закрашенного объекта, Wire – рисование каркасного объекта. Аргументы для обоих вариантов команд одни и те же.
Таблица 2.3 – GLAUX команды рисования 3D-примитивов
Команды |
Описание |
void auxWireSphere( GLdouble radius ) void auxSolidSphere( GLdouble radius ) |
сфера заданного радиуса |
void auxWireCube( GLdouble width ) void auxSolidCube( GLdouble width ) |
куб заданного размера |
void auxWire[Solid]Box( GLdouble width, GLdouble height, GLdouble lenght ) |
параллелепипед заданной ширины, высоты, длины |
void auxWire[Solid]Torus( GLdouble minRadius, GLdouble maxRadius ) |
тор, определямый внутренним и внешним радиусом |
void auxWire[Solid]Cylinder( GLdouble radius, GLdouble height ) void auxWire[Solid]Cone( GLdouble radius, GLdouble height ) |
цилиндр и конус с заданным радиусом основания и высотой |
void auxWire[Solid]Icosahedron( GLdouble width ) void auxWire[Solid]Octahedron( GLdouble width ) void auxWire[Solid]Tetrahedron( GLdouble width ) void auxWire[Solid]Dodecahedron( GLdouble width ) |
икосаэдр, октаэдр, тетраэдр и додекаэдр,
стороны которых задаются параметром width |
void auxWire[Solid]Teapot(GLdouble dim) |
чайник заданного размера dim |
Команды aux[Solid/Wire]Sphere, aux[Solid/Wire]Cylinder и aux[Solid/Wire]Cone вызывают непосредственно для рисования базовые команды OpenGL: gluSphere и gluCylinder. Полный список базовых команд приведен в табл. 2.4. Первым параметром для этих команд является указательqobjна объект типа GLUquadricObj. Далее следуют параметры непосредственно создаваемой фигуры.
Таблица 2.4 – Базовые команды рисования 3D-примитивов
Команды |
Описание |
void gluSphere( GLUquadricObj *qobj, GLdouble radius, GLint slices, GLint stacks) |
сфера заданного радиуса |
void gluCylinder( GLUquadricObj *qobj, GLdouble baseRadius, GLdouble topRadius, GLdouble height, GLint slices, GLint stacks) |
цилиндр с заданным радиусом нижнего основания (z=0), радиусом верхнего основания (z=height) и высотой |
void gluDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops) |
диск с заданным внутренним радиусом (может быть равен 0) и внешним радиусом |
void gluPartialDisk( GLUquadricObj *qobj, GLdouble innerRadius, GLdouble outerRadius, GLint slices, GLint loops, GLdouble startAngle, GLdouble sweepAngle) |
сектор с заданным внутренним радиусом, внешним радиусом, затем углом, с которого начинать рисовать, и длиной дуги в градусах, которую необходимо нарисовать |
Параметры slices – это число разбиений вокруг оси Z, stacks – число разбиений вдоль оси Z,loops– число концентрических колец.
Так как сложные объекты состоят из простых: точек, линий и многоугольников, то создать идеально гладкую сферу или цилиндр невозможно. Поэтому строится приближение из плоскостей. Для этого нужно указать количество разбиений. Чем больше разбиение, тем лучше будет ваша фигура. Оптимальным является число от 10 до 20. Чем больше объект, тем больше нужно разбиений.
Приведем пример рисования каркасного цилиндра и диска.
Пример:
void CALLBACK Reshape(int width, int height)
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-5, 5, -3, 3, -5, 5); // объем видимости
glMatrixMode(GL_MODELVIEW);
}
void CALLBACK Draw(void)
{
GLUquadricObj *quadObj = gluNewQuadric();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
glPushMatrix();
glTranslatef(-2.5f, 2.0f, 0.0f);
glRotatef(55.0f, 1.0f, 0.0f, 0.0f);
glScalef(2.0f, 2.0f, 2.0f);
gluQuadricDrawStyle(quadObj, GLU_LINE);
gluCylinder(quadObj, 0.5, 1.0, 2.0, 15, 10);
glTranslatef(2.5f, -1.5f, 0.0f);
glRotatef(-55.0f, 1.0f, 0.0f, 0.0f);
gluDisk(quadObj, 0.3, 1.0, 15, 5);
glPopMatrix();
glFinish();
gluDeleteQuadric(quadObj);
auxSwapBuffers();
}
Результат рисования представлен на рис. 2.3.
Рис. 2.3 Каркасный цилиндр и диск
Как видно из примера, чтобы нарисовать фигуру с помощью базовых команд, необходимо сначала создать объект типа GLUquadricObj,воспользовавшись командой:
GLUquadricObj*gluNewQuadric(void)
Затем установить стиль рисования с помощью функции:
void gluQuadricDrawStyle(
GLUquadricObj *qobj, GLenum drawStyle)
где qobj – указатель на созданный ранее объект,
drawStyle=GLU_FILL – рисуется сплошной объект,
drawStyle=GLU_LINE – каркасный (проволочный) объект,
drawStyle=GLU_POINT – рисуются только точки.
После завершения рисования необходимо удалить созданный объект, воспользовавшись командой:
void gluDeleteQuadric(GLUquadricObj *qobj)