Урок 5. Начинаем рисовать:
Чем мы будет на сей раз заниматься? Наверное, пора уже приступать к рисованию. Но с чего начать? Как ни странно, начнем с самого начала :)
В этом уроке мы научимся рисовать точки, линии, квадраты, треугольники, четырехугольники, и полигоны. Все это рисуется почти по одной же схеме. Для того чтобы научиться все это рисовать, мы должны разобраться с таким понятием, как примитив.
Что такое этот примитив? Однозначно сказать не можно. Одни считают, что примитив- это набор фигур, состоящих из прямой, многоугольника, и некоторой формы текста. Другие считают что в понятие примитив входят такие фигуры, как: окружности, различные кривые, поверхности, сплошные тела.
Примитив задается набором вершин. Вершина (Vertex)- это просто-напросто координата точки на экране. Например, треугольник можно нарисовать с помощью 3-х вершин (в двухмерной системе координат), для рисования линии нам хватит и двух, и т.д.
Синтаксис задания вершин таков:
glBegin(тип);
glVertex*(…);
…
glVertex*(…);
glEnd();
Где, * может быть [2,3][i,d,f,b], в зависимости от количества точек, и от типа чисел, которые мы будет использовать при задании точки. Например, если мы будем рисовать в двухмерном пространстве, и при этом использовать тип double, тогда функция будет иметь вид: glVertex2d(x,y);. Я думаю с этим все ясно. Если вы уже забыли синтаксис функций, то обратитесь к 4 уроку.
А теперь займемся самим рисованием. Первое, что мы будем рисовать- это точки. Но, перед этим давайте настроим наше приложение. Вот код, который мы написали в 2 уроке:
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void Display(void)
{
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400,500);
glutInitWindowPosition(0,0);
glutCreateWindow("OpenGL Lesson2");
glutDisplayFunc(Display);
glutMainLoop();
}
Как вы помните, у нас создалось некрасивое, прозрачное окно. Давайте теперь зададим цвет окна. Для этого в функцию main() допишем одну строку:
glClearColor(r,g,b,t);
Где, r-красный цвет, g-зеленый, b- голубой, t-прозрачность. Значение цветов выставлять нужно в диапазоне от 0 до 1 (т.е. 0.01, 0.2, 0.5, 0.83 и т.д.). Итак, выставьте нужный вам цвет, например поставим цвет фона белый. glClearColor(1,1,1,1);
И теперь нужно в функцию Display(void) добавить еще одну строку:
glClear(GL_COLOR_BUFFER_BIT);
Этой командой мы закрашиваем цвет фона в тот цвет, который указали в ф-и main();
Теперь давайте посмотрим на полный листинг нашей программы:
#include <GL/gl.h>
#include <GL/glut.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400,500);
glutInitWindowPosition(0,0);
glutCreateWindow("OpenGL Lesson2");
glClearColor(1,1,1,1);
glutDisplayFunc(Display);
glutMainLoop();
}
Запустите это приложение теперь. И что мы видим? Правильно, красивое белое окно! :)
Теперь что ни будь нарисуем. Итак, для рисования фигуры нам одной вершины не достаточно. Для это нам нужно объединить несколько вершин. Такое объединение вершин в одно целое называется примитив. Задание примитива происходит внутри командных скобок:
void glBegin (GLenum mode);
void glEnd (void);
Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения:
GL_POINTS каждая вершина задает координаты некоторой точки.
GL_LINES каждая отдельная пара вершин определяет отрезок; если задано нечетное число вершин, то последняя вершина игнорируется.
GL_LINE_STRIP каждая следующая вершина задает отрезок вместе с предыдущей.
GL_LINE_LOOP отличие от предыдущего примитива только в том, что последний отрезок определяется последней и первой вершиной, образуя замкнутую ломаную.
GL_TRIANGLES каждая отдельная тройка вершин определяет треугольник; если задано не кратное трем число вершин, то последние вершины игнорируются.
GL_TRIANGLE_STRIP каждая следующая вершина задает треугольник вместе с двумя предыдущими.
GL_TRIANGLE_FAN треугольники задаются первой и каждой следующей парой вершин (пары не пересекаются).
GL_QUADS каждая отдельная четверка вершин определяет четырехугольник; если задано не кратное четырем число вершин, то последние вершины игнорируются.
GL_QUAD_STRIP четырехугольник с номером n определяется
вершинами с номерами 2n-1, 2n, 2n+2, 2n+1.
GL_POLYGON последовательно задаются вершины выпуклого многоугольника.
Теперь давайте разберем все это на одном примере. В следующем примере нарисуем одну линию.
#include <GL/glut.h>
#include <GL/gl.h>
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glColor3d(0,0,0);
glVertex2d(-1,0);
glVertex2d(1,1);
glEnd();
glFlush();
}
void main(int argc,char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowSize(400,500);
glutInitWindowPosition(0,0);
glutCreateWindow("OpenGL Lesson2");
glClearColor(1,1,1,1);
glutDisplayFunc(Display);
glutMainLoop();
}
В этом примере есть две новые, нам не известные, функции, но об этом мы поговорим в следующий раз!
До встречи в следующем уроке!
Alex Salo
Навигация
Назад | Список уроков | Вперед
|