Треугольники
Для треугольника можно задавать те же параметры, что и для линии. Кроме того, есть еще одна функция 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();
