Быстрое введение в OpenSceneGraph (часть 2)

Эта часть посвящена обработке событий ввода.

osgGA::GUIEventAdapter

Класс osgGA::GUIEventAdapter содержит информацию о событии.

Методы

  • getEventType возвращает тип события: события мыши (PUSH, RELEASE, DOUBLECLICK, DRAG, MOVE, SCROLL), события клавиатуры (KEYDOWN, KEYUP) и несколько других (FRAME – конец очереди событий кадра, RESIZE – изменение размеров окна).

  • getTime – время события

  • getWindowX, getWindowY, getWindowWidth, getWindowHeight – положение и размер графического окна

  • getKey – нажатая кнопка клавиатуры

  • getX, getY – координаты курсора мыши

  • getXmin, getXmax, getYmin, getYmax – границы значений координат курсора мыши

  • getButtonMask – нажатые кнопки мыши

  • getModKeyMask – кнопки модификаторы (shift, ctrl, alt)

  • getHandled – индикатор, было ли событие уже обработано в другом обработчике

osgGA::GUIActionAdapter

Класс osgGA::GUIActionAdapter – интерфейсный класс. Обычно вместе с каждым событием osgGA::GUIEventAdapter дополнительно передается экземпляр osgGA::GUIActionAdapter, который содержит 2 полезных метода:

  • asView – возвращает экземпляр класса osg::View, связанный с этим событием

  • requestWarpPointer – перемещает курсор мыши в заданную точку

Обработка событий ввода

В части 1 уже упоминался метод frame, который занимается отрисовкой одного кадра. Выполнение метода frame распадается на 4 основных этапа: event, update, cull, draw.

Во время этапа event происходит обработка событий ввода, которые произошли в течение предыдущего кадра. В OpenSceneGraph существует 3 основных способа обработки событий ввода:

  • через объект-манипулятор
  • через обработчики событий
  • через функции обратного вызова у узлов графа сцены

3й вариант рассмотрим позже. А сейчас первые 2.

Манипуляторы

С каждым видом связан один объект-манипулятор – экземпляр класса, производного от osgGA::CameraManipulator. Задача этого объекта – перемещение наблюдателя по трехмерной сцене и соответственно расчет матрицы вида для главной камеры.

2 основных метода:

  • handle – обработка 1го события. Этот метод вызывается для каждого события из очереди

  • getInverseMatrix – этот метод должен возвращать матрицу вида. Он вызывается 1 раз за кадр после обработки всех событий

3 дополнительных метода:

  • setHomePosition – установка начального положения с помощью 3х векторов: eye, center, up

  • home – возврат в начальное положение

  • init – этот метод вызывается после изменений параметров графического окна

В составе OpenSceneGraph имеется несколько готовых классов-манипуляторов, которые реализуют различные модели движения (osgGA::TrackballManipulator, osgGA::DriveManipulator) и несколько классов-заготовок, которые можно использовать как базовые классы и расширять их функционал в производных классах.

Для тестирования разных манипуляторов и динамического переключения между ними можно использовать специальный манипулятор osgGA::KeySwitchMatrixManipulator, которые перенаправляет все вызовы текущему выбранному манипулятору.

Обработчики событий

Обработчик событий – экземпляр класса osgGA::GUIEventHandler. Прикрепляется к виду с помощью метода addEventHandler. К одному виду может быть прикреплено неограниченное количество обработчиков. В отличие от манипулятора обработчик может применяться для выполнения любых задач, связанных с событиями ввода.

Главный метод handle – обрабатывает 1 событие. Вызывается для каждого события из очереди событий.

В OpenSceneGraph имеется несколько встроенных обработчиков:

  • osgGA::StateSetManipulator – изменение ряда параметров визуализации: переключение режимов полигонов (‘w’), включение/отключение освещения (‘l’), включение/отключение текстур (‘t’), включение/отключение отбрасывания задних граней полигонов (‘b’). При инициализации нужно указать нужный экземпляр osg::StateSet (что это такое – позже). Пусть слово «манипулятор» в названии класса вас не смущает, это обычный обработчик. Пример подключения к вьюеру:
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
  • osgViewer::ThreadingHandler – переключение режимов многопоточности (‘m’)

  • osgViewer::WindowSizeHandler – переход в оконный режим и обратно (‘f’)

  • osgViewer::StatsHandler – вывод статистики (‘s’)

  • osgViewer::HelpHandler – показ справки, какие кнопки что означают (‘h’)

  • osgViewer::RecordCameraPathHandler – запись и воспроизведение маршрута движения камеры (‘z’, ‘Z’)

  • osgViewer::ScreenCaptureHandler – создание скриншота (‘c’)