Added support for control the pitch of the drive manipulator via the

up and down cursor keys.
This commit is contained in:
Robert Osfield 2005-02-22 19:19:50 +00:00
parent 8176434fc6
commit 10c3f934f1
2 changed files with 77 additions and 4 deletions

View File

@ -99,7 +99,11 @@ class OSGGA_EXPORT DriveManipulator : public MatrixManipulator
osg::Vec3d _eye; osg::Vec3d _eye;
osg::Quat _rotation; osg::Quat _rotation;
double _pitch;
double _distance; double _distance;
bool _pitchUpKeyPressed;
bool _pitchDownKeyPressed;
}; };
} }

View File

@ -24,6 +24,11 @@ using namespace osgGA;
#define DRIVER_HEIGHT 15 #define DRIVER_HEIGHT 15
// #define ABOSULTE_PITCH 1
// #define INCREMENTAL_PITCH 1
#define KEYBOARD_PITCH 1
static float getHeightOfDriver() static float getHeightOfDriver()
{ {
float height = 1.5f; float height = 1.5f;
@ -41,8 +46,13 @@ DriveManipulator::DriveManipulator()
_velocity = 0.0f; _velocity = 0.0f;
_height = getHeightOfDriver(); _height = getHeightOfDriver();
_buffer = _height*1.3; _buffer = _height*1.3;
_pitch = 0.0;
//_speedMode = USE_MOUSE_Y_FOR_SPEED; //_speedMode = USE_MOUSE_Y_FOR_SPEED;
_speedMode = USE_MOUSE_BUTTONS_FOR_SPEED; _speedMode = USE_MOUSE_BUTTONS_FOR_SPEED;
_pitchUpKeyPressed = false;
_pitchDownKeyPressed = false;
} }
@ -183,6 +193,8 @@ void DriveManipulator::home(const GUIEventAdapter& ea,GUIActionAdapter& us)
computePosition(_homeEye, _homeCenter, _homeUp); computePosition(_homeEye, _homeCenter, _homeUp);
_velocity = 0.0; _velocity = 0.0;
_pitch = 0.0;
us.requestRedraw(); us.requestRedraw();
@ -345,9 +357,44 @@ bool DriveManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)
_speedMode = USE_MOUSE_BUTTONS_FOR_SPEED; _speedMode = USE_MOUSE_BUTTONS_FOR_SPEED;
return true; return true;
} }
#ifdef KEYBOARD_PITCH
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up ||
ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Up)
{
_pitchUpKeyPressed = true;
return true;
}
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down ||
ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Down)
{
_pitchDownKeyPressed = true;
return true;
}
#endif
return false; return false;
} }
case(GUIEventAdapter::KEYUP):
{
#ifdef KEYBOARD_PITCH
if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up ||
ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Up)
{
_pitchUpKeyPressed = false;
return true;
}
else if (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down ||
ea.getKey()==osgGA::GUIEventAdapter::KEY_KP_Down)
{
_pitchDownKeyPressed = false;
return true;
}
#endif
return false;
}
_pitchDownKeyPressed = false;
case(GUIEventAdapter::FRAME): case(GUIEventAdapter::FRAME):
{ {
addMouseEvent(ea); addMouseEvent(ea);
@ -372,6 +419,8 @@ void DriveManipulator::getUsage(osg::ApplicationUsage& usage) const
usage.addKeyboardMouseBinding("Drive: Space","Reset the viewing position to home"); usage.addKeyboardMouseBinding("Drive: Space","Reset the viewing position to home");
usage.addKeyboardMouseBinding("Drive: q","Use mouse y for controlling speed"); usage.addKeyboardMouseBinding("Drive: q","Use mouse y for controlling speed");
usage.addKeyboardMouseBinding("Drive: a","Use mouse middle,right mouse buttons for speed"); usage.addKeyboardMouseBinding("Drive: a","Use mouse middle,right mouse buttons for speed");
usage.addKeyboardMouseBinding("Drive: Down","Cursor down key to look downwards");
usage.addKeyboardMouseBinding("Drive: Up","Cursor up key to look upwards");
} }
@ -396,12 +445,12 @@ void DriveManipulator::setByMatrix(const osg::Matrixd& matrix)
osg::Matrixd DriveManipulator::getMatrix() const osg::Matrixd DriveManipulator::getMatrix() const
{ {
return osg::Matrixd::rotate(_rotation)*osg::Matrixd::translate(_eye); return osg::Matrixd::rotate(_pitch,1.0,0.0,0.0)*osg::Matrixd::rotate(_rotation)*osg::Matrixd::translate(_eye);
} }
osg::Matrixd DriveManipulator::getInverseMatrix() const osg::Matrixd DriveManipulator::getInverseMatrix() const
{ {
return osg::Matrixd::translate(-_eye)*osg::Matrixd::rotate(_rotation.inverse()); return osg::Matrixd::translate(-_eye)*osg::Matrixd::rotate(_rotation.inverse())*osg::Matrixd::rotate(-_pitch,1.0,0.0,0.0);
} }
void DriveManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up) void DriveManipulator::computePosition(const osg::Vec3d& eye,const osg::Vec3d& center,const osg::Vec3d& up)
@ -481,18 +530,38 @@ bool DriveManipulator::calcMovement()
osg::Vec3d up = osg::Vec3d(0.0,1.0,0.0) * rotation_matrix; osg::Vec3d up = osg::Vec3d(0.0,1.0,0.0) * rotation_matrix;
osg::Vec3d lv = osg::Vec3d(0.0,0.0,-1.0) * rotation_matrix; osg::Vec3d lv = osg::Vec3d(0.0,0.0,-1.0) * rotation_matrix;
osg::Vec3d sv = osg::Vec3d(1.0,0.0,0.0) * rotation_matrix;
// rotate the camera. // rotate the camera.
double dx = _ga_t0->getXnormalized(); double dx = _ga_t0->getXnormalized();
double yaw = -inDegrees(dx*50.0f*dt); double yaw = -inDegrees(dx*50.0f*dt);
#ifdef KEYBOARD_PITCH
double pitch_delta = 0.5;
if (_pitchUpKeyPressed) _pitch += pitch_delta*dt;
if (_pitchDownKeyPressed) _pitch -= pitch_delta*dt;
#endif
#if defined(ABOSULTE_PITCH)
// abosolute pitch
double dy = _ga_t0->getYnormalized();
_pitch = -dy*0.5;
#elif defined(INCREMENTAL_PITCH)
// incremental pitch
double dy = _ga_t0->getYnormalized();
_pitch += dy*dt;
#endif
osg::Quat yaw_rotation; osg::Quat yaw_rotation;
yaw_rotation.makeRotate(yaw,up); yaw_rotation.makeRotate(yaw,up);
_rotation *= yaw_rotation; _rotation *= yaw_rotation;
rotation_matrix.makeRotate(_rotation); rotation_matrix.makeRotate(_rotation);
osg::Vec3d sv = osg::Vec3d(1.0,0.0,0.0) * rotation_matrix;
sv = osg::Vec3d(1.0,0.0,0.0) * rotation_matrix;
// movement is big enough the move the eye point along the look vector. // movement is big enough the move the eye point along the look vector.
if (fabs(_velocity*dt)>1e-8) if (fabs(_velocity*dt)>1e-8)