Библиотека сайта rus-linux.net
glColor3f(. ) . Команда glColor3f(. ) принимает три параметра, которые представляют RGB-составляющие желаемого цвета.
Изменение перспективы:
Вы можете изменить перспективу сцены с помощью следующих команд:
glRotatef(rX, 1.0, 0.0, 0.0); glRotatef(rY, 0.0, 1.0, 0.0);
Угол перспективы меняется в соответствии с тем, как пользователь нажимает клавиши со стрелками.
Рисование куба:
Рисование куба осуществляется от поверхности к поверхности. Для рисования каждой поверхности необходимо нарисовать два треугольника, за исключением передней поверхности, для рисования которой используются четыре треугольника.
После того, как вы получите корректные координаты треугольников, их рисование не будет представлять особых сложностей. Рисование каждого треугольника должно начинаться с вызова команды glBegin(GL_TRIANGLES) и заканчиваться вызовом команды glEnd() . GL_TRIANGLES является идентификатором примитива OpenGL. Существуют и другие идентификаторы примитивов: GL_POINTS , GL_LINES , GL_LINE_STRIP , GL_LINE_LOOP , GL_TRIANGLE_STRIP , GL_TRIANGLE_FAN , GL_QUADS , GL_QUAD_STRIP и GL_POLYGON . При этом в конечном счете каждый из примитивов OpenGL формируется из одного или нескольких треугольников.
OpenGL #9.1 — системы координат, примеры
Если вы рисуете фигуры с помощью треугольников ( GL_TRIANGLES ), порядок рисования вершин не важен. Если же вы рисуете фигуры с помощью прямоугольников ( GL_POLYGON ), рисование четырех вершин должно осуществляться в корректной последовательности, причем не важно, будет ли осуществляться обход вершин по часовой стрелке или против часовой стрелки. В том случае, если порядок рисования вершин будет нарушен, ваш прямоугольник не будет целостным.
Использование клавиш со стрелками:
Методика использования клавиш со стрелками является достаточно простой. В следующем фрагменте кода приложения осуществляется обработка события нажатия клавиши и, в случае установления факта нажатия одной из описанных клавиш, выполняется соответствующая операция:
void keyboard(int key, int x, int y) < if (key == GLUT_KEY_RIGHT) < rY += 15; >else if (key == GLUT_KEY_LEFT) < rY -= 15; >else if (key == GLUT_KEY_DOWN) < rX -= 15; >else if (key == GLUT_KEY_UP) < rX += 15; >// Запрос обновления изображения glutPostRedisplay(); >
Функция обратного вызова keyboard(. ) зарегистрирована в рамках функции main(. ) с помощью следующей строки кода:
glutSpecialFunc(keyboard);
Автоматическое вращение куба
В качестве бонуса давайте рассмотрим пример автоматического вращения куба (Рисунок 7).
В данном случае куб рисуется с помощью прямоугольников. Так как куб состоит из шести поверхностей, для его рисования требуется только шесть прямоугольников. В случае использования прямоугольников процесс рисования фигур значительно упрощается, причем одновременно с этим уменьшается объем исходного кода приложения, но при этом сложный код, использующий функции OpenGL, исполняется быстрее в случае использования треугольников.
OpenGL — Урок 1 — Первая программа
Примечание: любой объект может быть разделен на отдельные треугольники, но треугольник не может быть разделен на что-либо, кроме треугольников.
Рисунок 7. Графический вывод приложения на основе исходного кода из файла rotateCube.cc
В Листинге 3 приведен исходный код приложения из фала rotateCube.cc
Листинг 3. rotateCube.cc
// Разработчик: Mihalis Tsoukalos // Дата: Среда, 04 Июня 2014 // // Простая программа на основе OpenGL, которая рисует // автоматически вращающийся куб. // // g++ rotateCube.cc -lm -lglut -lGL -lGLU -o rotateCube #include #include // должно осуществляться корректное связывание библиотек GLUT и OpenGL #ifdef __APPLE__ #include #include #else #include #endif using namespace std; // Координаты вершин куба double x = 0.6; double y = 0.6; double z = 0.6; float angle = 0.0; void drawCube() < glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Сброс значений параметров преобразований glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -5.0); // Добавление рассеянного освещения GLfloat ambientColor[] = ; glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientColor); // Добавление точечного освещения GLfloat lightColor0[] = ; GLfloat lightPos0[] = ; glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor0); glLightfv(GL_LIGHT0, GL_POSITION, lightPos0); glTranslatef(0.5, 1.0, 0.0); glRotatef(angle, 1.0, 1.0, 1.0); glRotatef( angle, 1.0, 0.0, 1.0 ); glRotatef( angle, 0.0, 1.0, 1.0 ); glTranslatef(-0.5, -1.0, 0.0); // Создание трехмерного куба // Задняя поверхность glBegin(GL_POLYGON); glColor3f(0.5, 0.3, 0.2); glVertex3f(x, -y, z); glVertex3f(x, y, z); glVertex3f(-x, y, z); glVertex3f(-x, -y, z); glEnd(); // Передняя поверхность glBegin(GL_POLYGON); glColor3f(0.0, 0.5, 0.0); glVertex3f(-x, y, -z); glVertex3f(-x, -y, -z); glVertex3f(x, -y, -z); glVertex3f(x, y, -z); glEnd(); // Левая поверхность glBegin(GL_POLYGON); glColor3f(0.5, 0.5, 0.5); glVertex3f(-x, -y, -z); glVertex3f(-x, -y, z); glVertex3f(-x, y, z); glVertex3f(-x, y, -z); glEnd(); // Правая поверхность glBegin(GL_POLYGON); glColor3f(0.0, 0.0, 0.0); glVertex3f(x, -y, -z); glVertex3f(x, -y, z); glVertex3f(x, y, z); glVertex3f(x, y, -z); glEnd(); // Верхняя поверхность glBegin(GL_POLYGON); glColor3f(0.6, 0.0, 0.0); glVertex3f(x, y, z); glVertex3f(-x, y, z); glVertex3f(-x, y, -z); glVertex3f(x, y, -z); glEnd(); // Нижняя поверхность glBegin(GL_POLYGON); glColor3f(0.3, 0.0, 0.3); glVertex3f(-x, -y, -z); glVertex3f(-x, -y, z); glVertex3f(x, -y, z); glVertex3f(x, -y, -z); glEnd(); glFlush(); glutSwapBuffers(); > // Функция для плавного увеличения значения переменной угла поворота, // которыое находится в диапазоне 360) < angle -= 360; >glutPostRedisplay(); glutTimerFunc(25, update, 0); > // Инициализация системы вывода трехмерной графики void initRendering() < glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); // Установка цвета фона glClearColor(0.7f, 0.8f, 1.0f, 1.0f); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_NORMALIZE); >// Вызывается при изменении размера окна void handleResize(int w, int h) < glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0, (double)w / (double)h, 1.0, 200.0); >int main(int argc, char **argv) < glutInit( glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(700, 700); glutInitWindowPosition(100, 100); glutCreateWindow(«OpenGL — Rotating a Cube»); initRendering(); glutDisplayFunc(drawCube); glutReshapeFunc(handleResize); // Добавление таймера, при срабатывании которого будет вызываться функция update(. ) glutTimerFunc(25, update, 0); glutMainLoop(); return 0; >
Обратите внимание на то, что реализации функции main(. ) в файлах исходного кода triangle.cc, cube.cc и rotateCube.cc очень схожи, несмотря на то, что три программы предназначены для выполнения различных задач.
Наиболее важным аспектом данного приложения является использование функции glutTimerFunc(. ) . Данная функция позволяет зарегистрировать функцию обратного вызова таймера update(. ) , которая будет периодически вызываться по прошествии заданного количества миллисекунд. Функция update(. ) изменяет угол сцены при каждом вызове.
Заключение
Разработка приложений на основе OpenGL не является самым простым занятием, но данная статья должна стать отправной точкой для быстрого ознакомления с основными аспектами процесса разработки приложений на основе данной технологии. Если вы хотите стать специалистом по OpenGL, вам придется самостоятельно практиковаться в написании других приложений для вывода трехмерной графики. OpenGL является на первый взгляд достаточно простой технологией, которой, тем не менее, достаточно сложно овладеть в совершенстве.
Благодарности
Я хотел бы выразить признательность доктору Nikos Platis за то, что но поделился со мной небольшой частью своих знаний, относящихся к технологии OpenGL.
Дополнительные ресурсы
Книга «Learning Modern 3D Graphics Programming»: http://www.arcsynthesis.org/gltut
Книга «OpenGL Superbible, 6th edition, Graham Sellers, Richard S. Wright and Nicholas Haemel, Addison Wesley, ISBN: 0321902947»
Источник: rus-linux.net
Знакомимся с OpenGL
Знакомство с OpenGL нужно начать с того, что OpenGL — это спецификация. Т.е. OpenGL лишь определяет набор обязательных возможностей. Реализация же зависит от конкретной платформы.
OpenGL является кроссплатформенным, независимым от языка программирования API для работы с графикой. OpenGL — низкоуровневый API, поэтому для работы с ним неплохо иметь некоторое представление о графике в целом и знать основы линейной алгебры.
Именования
- Число параметров — указывает число принимаемых параметров. Принимает следующие значения: 1, 2, 3, 4
- Тип параметров — указывает тип принимаемых параметров. Возможны следующие значения: b, s, i, f, d, ub, us, ui. Т.е. byte (char в C, 8-битное целое число), short (16-битное целое число), int (32-битное целое число), float (число с плавающей запятой), double (число с плавающей запятой двойной точности), unsigned byte, unsigned short, unsigned int (последние три — беззнаковые целые числа)
- Представление параметров — указывает в каком виде передаются параметры, если каждое число по отдельности, то ничего не пишется, если же параметры передаются в виде массива, то к названию функции дописывается буква v
Графика
- GL_POINTS — каждая вершина задает точку
- GL_LINES — каждая отдельная пара вершин задает линию
- GL_LINE_STRIP — каждая пара вершин задает линию (т.е. конец предыдущей линии является началом следующей)
- GL_LINE_LOOP — аналогично предыдущему за исключением того, что последняя вершина соединяется с первой и получается замкнутая фигура
- GL_TRIANGLES — каждая отдельная тройка вершин задает треугольник
- GL_TRIANGLE_STRIP — каждая следующая вершина задает треугольник вместе с двумя предыдущими (получается лента из треугольников)
- GL_TRIANGLE_FAN — каждый треугольник задается первой вершиной и последующими парами (т.е. треугольники строятся вокруг первой вершины, образуя нечто похожее на диафрагму)
- GL_QUADS — каждые четыре вершины образуют четырехугольник
- GL_QUAD_STRIP — каждая следующая пара вершин образует четырехугольник вместе с парой предыдущих
- GL_POLYGON — задает многоугольник с количеством углов равным количеству заданных вершин
- glBegin ( GL_QUADS ) ;
- glColor3f ( 1.0 , 1.0 , 1.0 ) ;
- glVertex2i ( 250 , 450 ) ;
- glColor3f ( 0.0 , 0.0 , 1.0 ) ;
- glVertex2i ( 250 , 150 ) ;
- glColor3f ( 0.0 , 1.0 , 0.0 ) ;
- glVertex2i ( 550 , 150 ) ;
- glColor3f ( 1.0 , 0.0 , 0.0 ) ;
- glVertex2i ( 550 , 450 ) ;
- glEnd ( ) ;
Основы программы на OpenGL
- GLUT_RGBA — включает четырехкомпонентный цвет (используется по умолчанию)
- GLUT_RGB — то же, что и GLUT_RGBA
- GLUT_INDEX — включает индексированный цвет
- GLUT_DOUBLE — включает двойной экранный буфер
- GLUT_SINGLE — включает одиночный экранный буфер (по умолчанию)
- GLUT_DEPTH — включает Z-буфер (буфер глубины)
- GLUT_STENCIL — включает трафаретный буфер
- GLUT_ACCUM — включает буфер накопления
- GLUT_ALPHA — включает альфа-смешивание (прозрачность)
- GLUT_MULTISAMPLE — включает мультисемплинг (сглаживание)
- GLUT_STEREO — включает стерео-изображение
- void glutDisplayFunc (void (*func) (void)) — задает функцию рисования изображения
- void glutReshapeFunc (void (*func) (int width, int height)) — задает функцию обработки изменения размеров окна
- void glutVisibilityFunc (void (*func)(int state)) — задает функцию обработки изменения состояния видимости окна
- void glutKeyboardFunc (void (*func)(unsigned char key, int x, int y)) — задает функцию обработки нажатия клавиш клавиатуры (только тех, что генерируют ascii-символы)
- void glutSpecialFunc (void (*func)(int key, int x, int y)) — задает функцию обработки нажатия клавиш клавиатуры (тех, что не генерируют ascii-символы)
- void glutIdleFunc (void (*func) (void)) — задает функцию, вызываемую при отсутствии других событий
- void glutMouseFunc (void (*func) (int button, int state, int x, int y)) — задает функцию, обрабатывающую команды мыши
- void glutMotionFunc (void (*func)(int x, int y)) — задает функцию, обрабатывающую движение курсора мыши, когда зажата какая-либо кнопка мыши
- void glutPassiveMotionFunc (void (*func)(int x, int y)) — задает функцию, обрабатывающую движение курсора мыши, когда не зажато ни одной кнопки мыши
- void glutEntryFunc (void (*func)(int state)) — задает функцию, обрабатывающую движение курсора за пределы окна и его возвращение
- void glutTimerFunc (unsigned int msecs, void (*func)(int value), value) — задает функцию, вызываемую по таймеру
Первая программа
Теперь мы знаем основы работы с OpenGL. Можно написать простую программу для закрепления знаний.
Начнем с того, что нужно подключить заголовочный файл GLUT:
- #if defined(linux) || defined(_WIN32)
- #include /*Для Linux и Windows*/
- #else
- #include /*Для Mac OS*/
- #endif
Теперь мы уже знаем, что писать в main. Зарегистрируем два обработчика: для рисования содержимого окна и обработки изменения его размеров. Эти два обработчика по сути используются в любой программе, использующей OpenGL и GLUT.
- int main ( int argc , char * argv [ ] )
- glutInit (
- glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGBA ) ; /*Включаем двойную буферизацию и четырехкомпонентный цвет*/
- glutInitWindowSize ( 800 , 600 ) ;
- glutCreateWindow ( «OpenGL lesson 1» ) ;
- glutReshapeFunc ( reshape ) ;
- glutDisplayFunc ( display ) ;
- glutMainLoop ( ) ;
- return 0 ;
- >
Теперь надо написать функцию-обработчик изменений размеров окна. Зададим область вывода изображения размером со все окно при помощи команды glViewport (х, у, ширина, высота). Затем загрузим матрицу проекции glMatrixMode (GL_PROJECTION), заменим ее единичной glLoadIdentity () и установим ортогональную проекцию. И наконец загрузим модельно-видовую матрицу glMatrixMode (GL_MODELVIEW) и заменим ее единичной.
В итоге получим:
- void reshape ( int w , int h )
- glViewport ( 0 , 0 , w , h ) ;
- glMatrixMode ( GL_PROJECTION ) ;
- glLoadIdentity ( ) ;
- gluOrtho2D ( 0 , w , 0 , h ) ;
- glMatrixMode ( GL_MODELVIEW ) ;
- glLoadIdentity ( ) ;
- >
- GL_COLOR_BUFFER_BIT — для очистки буфера цвета
- GL_DEPTH_BUFFER_BIT — для очистки буфера глубины
- GL_ACCUM_BUFFER_BIT — для очистки буфера накопления
- GL_STENCIL_BUFFER_BIT — для очистки трафаретного буфера
- void display ( )
- glClear ( GL_COLOR_BUFFER_BIT ) ;
- glBegin ( GL_QUADS ) ;
- glColor3f ( 1.0 , 1.0 , 1.0 ) ;
- glVertex2i ( 250 , 450 ) ;
- glColor3f ( 0.0 , 0.0 , 1.0 ) ;
- glVertex2i ( 250 , 150 ) ;
- glColor3f ( 0.0 , 1.0 , 0.0 ) ;
- glVertex2i ( 550 , 150 ) ;
- glColor3f ( 1.0 , 0.0 , 0.0 ) ;
- glVertex2i ( 550 , 450 ) ;
- glEnd ( ) ;
- glutSwapBuffers ( ) ;
- >
Итог
Все! Можно компилировать. Должно получиться что-то вроде этого:
Весь код целиком (для кто не осилил статью).
В принципе ничего сложного в этом нет, по крайней мере если вы уже сталкивались с графикой до этого.
OpenGL — удобный инструмент для создания кроссплатформенных приложений, использующий графику. OpenGL легко использовать с тем языком программирования, который вам более удобен. Привязки к OpenGL есть для множества популярных языков, таких как C, C++, C#, Java, Python, Perl, VB и других. Посмотреть информацию о них можно на официальном сайте OpenGL.
Источник: habr.com
Введение в OpenGL на Qt/C++. Часть 1
В данном уроке мне хотелось бы изложить основы программирование графики с использованием OpenGL на платформе Qt/C++.
Первая часть является вводной, и для понимания материала читателю достаточно понимать основы программирования на С++.
Чтобы подключить OpenGL в Qt достаточно в файле проекта (*.pro) прописать
Qt += opengl