Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OpenGL для методички по КГ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
100 Кб
Скачать
☆

Треугольники

Для треугольника можно задавать те же параметры, что и для линии. Кроме того, есть еще одна функция glPolygonMode. Она устанавливает опции для отрисовки многоугольника. Первый параметр может принимать значения - GL_FRONT, GL_BACK и GL_FRONT_AND_BACK. Второй параметр указывает, как будет рисоваться многоугольник. Он принимает значения - GL_POINT (рисуются только точки), GL_LINE (рисуются линии) и GL_FILL (рисуется заполненный многоугольник). Первый параметр указывает к какой из сторон (лицевой, тыльной или же к обеим сразу) применяется опция, заданная вторым параметром. Треугольники можно рисовать, передав GL_TRIANGLE_STRIP или GL_TRIANGLE_FAN в glBegin. В первом случае первая, вторая и третья вершины задают первый треугольник. Вторая, третья и четвертая вершина - второй треугольник. Третья, четвертая и пятая вершина - третий треугольник и т.д. Вершины n, n+1 и n+2 определят n-ый треугольник. Во втором случае первая, вторая и третья вершина задают первый треугольник. Первая, третья и четвертая вершины задают второй треугольник и т.д. Вершины 1, n+1, n+2 определяют n-ый треугольник.

Ниже приведен пример построения треугольника (с комментариями):

glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); //см. выше

glBegin(GL_TRIANGLES);

glColor3d(1,0,0); // рисуем треугольник

glVertex3d(-4,2,0);

glVertex3d(-3,2.9,0);

glVertex3d(-2,2,0);

glEnd();

glLineWidth(2);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //рисуем проволочные треугольники

glBegin(GL_TRIANGLE_STRIP); // обратите внимание на порядок вершин

glColor3d(0,1,0);

glVertex3d(1,2,0);

glVertex3d(0,2.9,0);

glVertex3d(-1,2,0);

glVertex3d(0,1.1,0);

glEnd();

glEnable(GL_LINE_STIPPLE);

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBegin(GL_TRIANGLE_FAN);

glColor3d(0,0,1);

glVertex3d(4,2,0);

glVertex3d(2.6,2.8,0);

glVertex3d(2,2,0);

glVertex3d(3,1.1,0);

glEnd();

glDisable(GL_LINE_STIPPLE);

Четырехугольники и многоугольники

Четырехугольники рисуются вызовом функции glBegin с параметром GL_QUADS или GL_QUAD_STRIP. Для первого случая каждые четыре вершины определяют свой четырехугольник. Во втором случае рисуются связанные четырехугольники. Первая, вторая, третья и четвертая вершина определяют первый четырехугольник. Третья, четвертая, пятая и шестая вершина - второй четырехугольник и т.д. (2n-1), 2n, (2n+1) и (2n+2) вершины задают n-ый четырехугольник. Многоугольники задаются вызовом glBegin с параметром GL_POLYGON. Все вершины определяют один многоугольник. Для многоугольников можно задавать стили при помощи выше описанной функции glPolygonMode, толщину линии, толщину точек и цвет.

Построение простейших фигур различными способами

1-ый способ:

Существует набор функций для построения сфер, цилиндров и дисков. Непосредственно отображение происходит, используя следующие функции: gluSphere, gluCylinder, gluDisk и gluPartialDisk.

 Каждая функция OpenGL начинается с префикса "gl" или "glu". Далее следует название функции. После названия - количество параметров (если функция определена для разного кол-ва параметров). И, наконец, переменными какого типа являются параметры: 

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

Например glColor3f() означает, что цвет задаётся тремя компонентами типа GLfloat.  Для рисования сферы используется механизм из glu32.dll. Создаётся объект типа GLUquadricObj() и инициализируется с помощью функции gluNewQuadric(). Далее устанавливается стиль фигуры функцией gluQuadricDrawStyle(quadObj, GLU_FILL). Стиль может быть GLU_FILL, GLU_LINE  или GLU_POINT.

Задание 1. Проверьте, что означают стили: GLU_FILL, GLU_LINE  или GLU_POINT.

gluSphere() - делает из quadObj сферу. Три последних параметра - это радиус и количество разбиений поперёк и вдоль оси Z соответственно. И не забудем освободить память, занимаемую под quadObj - gluDeleteQuadric(quadObj).

Пример:

GLUquadricObj *quadObj;

quadObj = gluNewQuadric(); // создаем новый объект для создания сфер и цилиндров

glPushMatrix();

glColor3f(1.0,1.0,0.0); // задаем цвет всех последующих объектов

gluQuadricDrawStyle(quadObj, GLU_FILL); // устанавливаем стиль: сплошной

// gluQuadricDrawStyle(quadObj, GLU_LINE); // устанавливаем стиль: проволочный

gluSphere(quadObj, 0.5, 10, 10); // рисуем сферу радиусом 0.5

gluDeleteQuadric(quadObj);

glPopMatrix();

2-ый способ:

Пример:

glPushMatrix();

glTranslatef(2.5f,0.0f,0.0f); // Сдвиг вправо на 2.5

glColor3f(1.0,0.0,0.0);

auxSolidSphere(0.5); // Сфера с радиусом 0.5

glPopMatrix();

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

  • auxSolidCube(width) // куб

  • auxSolidBox(width, height, depth) // коробка

  • auxSolidTorus(r,R) // тор

  • auxSolidCylinder(r,height) // цилиндр

  • auxSolidCone(r,height) // конус

  • auxSolidIcosahedron(width) // многогранники

  • auxSolidOctahedron(width)

  • auxSolidTetrahedron(width)

  • auxSolidDodecahedron(width)

  • auxSolidTeapot(width) // рисует чайник

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

Пример:

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

3-ий способ:

Построение сферы параметрическим способом в OpenGL.

glPushMatrix();

glTranslatef(-3.0f,0.0f,0.0f);

double l=0; // угол 0<=l<=360

double b=0; // угол 0<=b<=180

double pi = 3.1415926535*2;

int grani=10;

double shag_1 = pi/(grani*2); / шаг с которым мы будем строить фигуру

double shag_2 = pi/2/grani; / и как следствие количество граней сферы

for (int i = 1 ; i <= grani*2 ; i++ ) {

l=l+shag_1;

b=0;

for(int j=1; j<=grani; j++){

b=b+shag_2;

glBegin(GL_QUADS);

glVertex3f(sin(b-shag_2)*cos(l-shag_1),sin(b-shag_2)*sin(l-shag_1),cos(b-shag_2));

glVertex3f(sin(b)*cos(l-shag_1),sin(b)*sin(l-shag_1),cos(b));

glVertex3f(sin(b)*cos(l),sin(b)*sin(l),cos(b));

glVertex3f(sin(b-shag_2)*cos(l),sin(b-shag_2)*sin(l),cos(b-shag_2));

glEnd();

}

}

glPopMatrix();

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