Previous Entry Share Next Entry
Быстрое введение в OpenSceneGraph. Часть 2.
alex_bobkov

Обновил часть 1: добавил описание класса osg::DisplaySettings.

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

1. Класс 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 – индикатор, было ли событие уже обработано в другом обработчике

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5. Обработчик событий – экземпляр класса 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’)


?

Log in