Активизируя кнопку мыши, когда курсор находится в пределах окна на экране дисплея, можно выбрать точку для отображения примитива, такого как отдельная точка, отрезок или закрашенная область. Кроме того, мышь можно использовать в качестве указательного устройства, сравнивая возвращенную координату с границами отображенных объектов на сцене. Впрочем, OpenGL предлагает процедуры для использования мыши в качестве указательного устройства, и эти процедуры рассматриваются в следующем разделе.
В качестве простого примера использования процедуры glutMouseFunc приведем программу, изображающую красную точку размера 3 в месте расположения курсора в окне на экране дисплея при каждом щелчке левой кнопкой мыши. Поскольку начало координат для функций-примитивов OpenGL находится в левом нижнем углу окна на экране дисплея, в процедуре mousePtPlot нужно использовать транспонированное возвращенное значение yMouse.
♦include <GL/glut.h>
GLsizei winWidth = 400, winHeight = 300;
/* Исходный размер окна на экране. */
void init (void)
{
glClearColor (0.0, 0.0, 1.0, 1.0) // Цвет окна выбран синим. glMatrixMode (GL_PROJECTION); gluOrtho2D (0.0, 200.0, 0.0, 150.0);
}
void displayFcn (void)
{
glClear (GL_COLOR_BUFFER_BIT);
/* Очищается окно на экране дисплея. */
glColor3f (1.0, 0.0, 0.0); // Цвет точки выбран красным.
glPointSize (3.0); // Размер точки равен 3,0.
}
void winReshapeFcn (GLint newWidth, GLint newHeight)
{
/* Обновление точки обзора и проекционных параметров. */ glViewport (0, 0, newWidth, newHeight); glMatrixMode (GL_PROJECTION) ; glLoadldentity ( );
gluOrtho2D (0.0, GLdouble (newWidth), 0.0,
GLdouble (newHeight));
/* Обновления параметров размера окна. */ winWidth = newWidth; winHeight = newHeight;
}
void plotPoint (GLint x, GLint y) t
glBegin (GL_POINTS);
glVertex2i (x, y); glEnd ( );
}
void mousePtPlot (GLint button, GLint action, GLint xMouse,
GLint yMouse)
{
if (button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) plotPoint (xMouse, winHeight - yMouse); glFlush ( );
void main (int arge, char** argv)
{
glutlnit (Sarge, argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (100, 100); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Изображение точек мышью"); init ( );
glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn); glutMouseFunc (mousePtPlot); glutMainLoop ( );
}
Рис. 11.13. Пример выхода интерактивной процедуры polyline
В следующей программе данные, введенные мышью, используются для выбора конечной точки отрезка. Выбранные отрезки соединяются, что демонстрирует интерактивное построение ломанной линии. Изначально нужно выбрать две точки окна, причем первый отрезок задается щелчками левой кнопкой мыши. Каждая последующая выбранная точка задает другой сегмент ломанной. Пример выхода этой программы представлен на рис. 11.13.
finclude <GL/glut.h>
GLsizei winWidth = 400, winHeight = 300;
/* Исходный размер окна на экране. */
GLint endPtCtr = 0;
/* Инициализация счетчика конечных точек отрезков. */ class scrPt { public;