У меня есть требование ввести код, чтобы переключать чувствительность мыши — увеличивать или уменьшать скорость ходьбы моей камеры по сцене. В настоящее время у меня есть обработчик событий, предназначенный для перехвата команд клавиатуры и их соответствующей обработки. Отсутствует правильный код для замедления / увеличения скорости на выбранную величину.
У меня есть перечисление ниже, чтобы изобразить приемлемые значения увеличения / уменьшения.
enum CameraSpeed {_WALK = 10, _BRISK_WALK = 17, _JOG = 23, _RUN = 31, _RUN_FAST = 34, _FLY=60};
CameraSpeed _current_camera_speed;
Я попытался переписать метод bool executeMovement () базового класса CameraManipulator следующим образом, но при тщательном рассмотрении это, похоже, не тот код, который мне нужно переопределить или использовать для этой цели. Я был бы признателен за помощь не только в выборе правильного метода, но и в его изменении, чтобы я мог еще больше контролировать чувствительность.
bool WalkingCameraManipulator::performMovement()
{
// return if less then two events have been added
if( _ga_t0.get() == NULL || _ga_t1.get() == NULL )
return false;
// get delta time
double eventTimeDelta = _ga_t0->getTime() - _ga_t1->getTime();
if( eventTimeDelta < 0. )
{
OSG_WARN << "Manipulator warning: eventTimeDelta = " << eventTimeDelta << std::endl;
eventTimeDelta = 0.;
}
// get deltaX and deltaY
float dx = (_ga_t0->getXnormalized() - _ga_t1->getXnormalized()/_current_camera_speed);
float dy = (_ga_t0->getYnormalized() - _ga_t1->getYnormalized())/_current_camera_speed;
// return if there is no movement.
if( dx == 0. && dy == 0. )
return false;// call appropriate methods
unsigned int buttonMask = _ga_t1->getButtonMask();
if( buttonMask == GUIEventAdapter::LEFT_MOUSE_BUTTON )
{
return performMovementLeftMouseButton( eventTimeDelta, dx, dy );
}
else if( buttonMask == GUIEventAdapter::MIDDLE_MOUSE_BUTTON ||
buttonMask == (GUIEventAdapter::LEFT_MOUSE_BUTTON | GUIEventAdapter::RIGHT_MOUSE_BUTTON) )
{
return performMovementMiddleMouseButton( eventTimeDelta, dx, dy );
}
else if( buttonMask == GUIEventAdapter::RIGHT_MOUSE_BUTTON )
{
return performMovementRightMouseButton( eventTimeDelta, dx, dy );
}
return false;
}
Задача ещё не решена.
Других решений пока нет …