Создание графического интерфейса
Для создания графического элементов управления с использованием OpenGL воспользуемся библиотекой GLUI.
OpenGL User Interface Library (GLUI) − библиотека элементов интерфейса пользователя, она предоставляет такие виджеты, как кнопка, флажок, радиокнопка, спинер для приложений OpenGL. Это не зависящая от оконной и операционной системы библиотека, опирающаяся на GLUT.
Описание библиотеки можно найти на сайте http://glui.sourceforge.net/
Для ее установки потребуется скачать дистрибутив, например, версия 2.35.
Из папки src\include\GL cкопировать файл glui.h в каталог include папки VC вашей MVS20хх.
Также для компиляции lib файла, необходимо открыть файл решения из папки src\msvc\glui.sln. Далее выбрать проект _glui library и собрать библиотеку glui.lib.
Если во время компиляции компилятор выдает ошибку переопределения функции exit() - C2381, то компиляцию необходимо повторить со следующей опцией препроцессора. Для этого заходим в свойства проекта Properties -> C/C++ -> Preprocessor -> Preprocessor definitions и через ";" добавляем GLUT_BUILDING_LIB.
Затем копируем полученный lib файл в папку lib вашей MVS20хх.
Далее смотрим примеры из библиотеки и рассмотренные ниже.
Пример#9 - Создание ScrollBar и инструмента вращения для Куба
#include <string.h>
#include <glui.h>
#include <iostream>
#include <stdio.h>
using namespace std;
#define COLOR_RED 1
#define COLOR_GREEN 2
#define COLOR_BLUE 3
GLUI *glui;
int main_window=0;
GLUI_Scrollbar *sbRed;
GLUI_Scrollbar *sbGreen;
GLUI_Scrollbar *sbBlue;
GLfloat red = 100.0f;
GLfloat green = 100.0f;
GLfloat blue = 100.0f;
float xy_aspect;
float cube_rotate[16] = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
float view_rotate[16] = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 };
float obj_pos[] = { 0.0, 0.0, 0.0 };
void myGlutReshape( int x, int y )
{
int tx, ty, tw, th;
GLUI_Master.get_viewport_area( &tx, &ty, &tw, &th );
glViewport( tx, ty, tw, th );
xy_aspect = (float)tw / (float)th;
glutPostRedisplay();
}
void myGlutDisplay( void )
{
glClearColor( red/100.0f, green/100.0f, blue/100.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -xy_aspect*.04, xy_aspect*.04, -.04, .04, .1, 15.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glLoadIdentity();
glTranslatef( 0.0, 0.0, -2.6f );
glTranslatef( obj_pos[0]+0.5, obj_pos[1], -obj_pos[2] );
glColor3f(0.0, 0.0, 0.0);
glPushMatrix();
glTranslatef( -.5, 0.0, 0.0 );
glMultMatrixf( cube_rotate );
glRotatef(45,1,1,0);
glutWireCube(0.4);
glPopMatrix();
glutSwapBuffers();
glutPostRedisplay();
glFlush();
}
void mouse(int button,int state,int x,int y)
{
switch(button)
{
case GLUT_MIDDLE_BUTTON:
exit(0);
}
//glutPostRedisplay() ;
}
void UpadteValues(int control )
{
if (control==COLOR_RED)
{
red = sbRed->get_float_val();
//cout<<red<<endl;//[0,100]
}
if (control==COLOR_GREEN)
{
green = sbGreen->get_float_val();
//cout<<green<<endl;
}
if (control==COLOR_BLUE)
{
blue = sbBlue->get_float_val();
//cout<<blue<<endl;
}
}
void myGlutIdle( void )
{
if ( glutGetWindow() != main_window )
glutSetWindow(main_window);
glutPostRedisplay();
}
void myGlutMotion(int x, int y )
{
glFlush();
glutPostRedisplay();
}
void GUI()
{
glui = GLUI_Master.create_glui_subwindow( main_window,
GLUI_SUBWINDOW_LEFT );
sbRed = new GLUI_Scrollbar( glui, "Red",GLUI_SCROLL_HORIZONTAL,&red,COLOR_RED,UpadteValues);
sbRed->set_float_limits(0,100);
sbRed->set_w(150);
sbGreen = new GLUI_Scrollbar( glui, "Green",GLUI_SCROLL_HORIZONTAL,&green,COLOR_GREEN,UpadteValues);
sbGreen->set_float_limits(0,100);
sbGreen->set_w(150);
sbBlue = new GLUI_Scrollbar( glui, "Blue",GLUI_SCROLL_HORIZONTAL,&blue,COLOR_BLUE,UpadteValues);
sbBlue->set_float_limits(0,100);
sbBlue->set_w(150);
for(int i=0;i<24;i++)
new GLUI_StaticText( glui, "" );
GLUI_Rotation *sph_rot = new GLUI_Rotation(glui, "CUBE", cube_rotate );
sph_rot->set_spin(1);
sph_rot->set_h(150);
sph_rot->set_w(150);
}
int main(int argc, char* argv[])
{
setlocale(0,"RUS");
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE|GLUT_RGBA |GLUT_DEPTH );//
glutInitWindowPosition( 50, 50 );
glutInitWindowSize( 800, 600 );
main_window = glutCreateWindow( "UI EasyExample" );
GLUI_Master.set_glutSpecialFunc( NULL );
glutDisplayFunc( myGlutDisplay );
GLUI_Master.set_glutReshapeFunc( myGlutReshape );
glutMotionFunc( myGlutMotion );
//glutIdleFunc(myGlutDisplay); no work with glui
GUI();
glutMouseFunc(mouse);
#if 0
// We register the idle callback with GLUI, *not* with GLUT
GLUI_Master.set_glutIdleFunc( myGlutIdle );
#endif
glutMainLoop();
return EXIT_SUCCESS;
}
Для самостоятельной работы:
1. Создайте скролбар для изменения параметров прямоугольника.
2. Создайте объект glui_rotation для изменения ориентации спутника.