[osg-users] First Person Camera disable inertial rotation

Julien Valentin julienvalentin51 at gmail.com
Thu Mar 28 19:44:47 PDT 2019


aa.requestContinuousUpdate( false )?


Ligvest wrote:
> Windows 10 x64
> 
> Hi, i'm trying to make a FPS camera. I have found some examples from other sources and now i have camera, that can move by WASD and have its own default looking system. I press right mouse button and rotate camera. But i still have inertial rotating when i release the mouse button. How to disable this feature? 
> 
> tell me if you need more information.
> I think that i need change something in function 
> Code:
> FirstPersonController::myRotateYawPitch()
> 
>  but can't to find what i need to change.
> Here is my FPS controller .cpp file:
> 
> 
> 
> Code:
> #include "FirstPersonController.h"
> 
> bool FirstPersonController::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
> {
> 
>     // Still use first person manipulator for camera movements (Inherited class function)
>     FirstPersonManipulator::handle(ea, aa);
> 
>     if (!viewer_)
>     {
>         return false;
>     }
> 
>     // Set the viewer's "eye" position, which is located at the center of the camera.
>     osg::Vec3d eyePos;
>     osg::Matrix matrix = viewer_->getCameraManipulator()->getMatrix();
> 
>     eyePos = matrix.getTrans();
> 
>     osg::Quat camRotation = matrix.getRotate();
> 
>     switch(ea.getEventType()) {
>     case(osgGA::GUIEventAdapter::KEYDOWN):
>     {
>         // Movement of the camera correlates with W, A, S, D
>         switch(ea.getKey())
>         {
>         case 'w':
>             isWPressed = true;
>             break;
>         case 'a':
>             isAPressed = true;
>             break;
>         case 's':
>             isSPressed = true;
>             break;
>         case 'd':
>             isDPressed = true;
>             break;
>         default:
>             break;
>         }
> 
>         break;
>     }
> 
>     case(osgGA::GUIEventAdapter::KEYUP):
>     {
>         switch(ea.getKey())
>         {
>         case 'w':
>             isWPressed = false;
>             tempMov_.set(0, 0, 0);
>             break;
>         case 'a':
>             isAPressed = false;
>             tempMov_.set(0, 0, 0);
>             break;
>         case 's':
>             isSPressed = false;
>             tempMov_.set(0, 0, 0);
>             break;
>         case 'd':
>             isDPressed = false;
>             tempMov_.set(0, 0, 0);
>             break;
>         default:
>             break;
>         }
>         break;
>     }
> 
>     }
> 
>     doTranslate();
>     eyePos += camRotation * tempMov_;
>     matrix.setTrans(eyePos);
> 
>     // Check [mainTimer.time % (time divisor) == 0]
>     if (mainTimer_.time_s() >= maxTick_)
>     {
>         viewer_->getCameraManipulator()->setByMatrix(matrix);
>         maxTick_ += inputTimeInterval_;
>     }
> 
> 
>     return false;
> }
> 
> bool FirstPersonController::performMovement()
> {
>     // return if less then two events have been added
>     if( _ga_t0.get() == NULL || _ga_t1.get() == NULL )
>     {
>         return false;
>     }
> 
>     // get delta time, throw warning if error with 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();
>     float dy = _ga_t0->getYnormalized() - _ga_t1->getYnormalized();
> 
>     // return if there is no movement.
>     if( dx == 0.0 && dy == 0.0 )
>     {
>         return false;
>     }
> 
>     // call appropriate methods
>     unsigned int buttonMask = _ga_t1->getButtonMask();
>     if( buttonMask == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON )
>     {
> 
> //      return performMovementLeftMouseButton( eventTimeDelta, dx, dy );
>         osg::CoordinateFrame coordinateFrame = getCoordinateFrame( _eye );
>         osg::Vec3d localUp = getUpVector( coordinateFrame );
>         myRotateYawPitch( _rotation, dx, dy, localUp );
> //        rotateYawPitch( _rotation, dx, dy, localUp );
> 
>         return true;
>     }
>     else if( buttonMask == osgGA::GUIEventAdapter::MIDDLE_MOUSE_BUTTON ||
>              buttonMask == (osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON | osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON) )
>     {
>         //return performMovementMiddleMouseButton( eventTimeDelta, dx, dy );
>     }
>     else if( buttonMask == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON )
>     {
>         //return performMovementRightMouseButton( eventTimeDelta, dx, dy );
>     }
> 
>     return false;
> }
> 
> 
> void FirstPersonController::doTranslate() {
> 
>     if(isWPressed){
>         tempMov_.z() = -moveSpeed_;
>     }
>     if(isAPressed){
>         tempMov_.x() = -moveSpeed_;
>     }
>     if(isSPressed){
>         tempMov_.z() = moveSpeed_;
>     }
>     if(isDPressed){
>         tempMov_.x() = moveSpeed_;
>     }
> }
> 
> 
> 
> void FirstPersonController::myRotateYawPitch( osg::Quat& rotation, const double yaw, const double pitch, const osg::Vec3d& localUp )
> {
>     bool verticalAxisFixed = (localUp != osg::Vec3d( 0.,0.,0. ));
> 
>     // fix current rotation
>     if( verticalAxisFixed ){
>         fixVerticalAxis( rotation, localUp, true );
>     }
> 
>     // rotations
>     osg::Quat rotateYaw( -yaw, verticalAxisFixed ? localUp : rotation * osg::Vec3d( 0.,1.,0. ) );
>     osg::Quat rotatePitch;
>     osg::Quat newRotation;
>     osg::Vec3d cameraRight( rotation * osg::Vec3d( 1.,0.,0. ) );
> 
>     double my_dy = pitch;
>     int i = 0;
> 
>     do {
> 
>         // rotations
>         rotatePitch.makeRotate( my_dy, cameraRight );
>         newRotation = rotation * rotateYaw * rotatePitch;
> 
>         my_dy = 0;
> 
> 
>         // update vertical axis
>         if( verticalAxisFixed ){
>             fixVerticalAxis( newRotation, localUp, false );
>         }
> 
>         // check for viewer's up vector to be more than 90 degrees from "up" axis
>         osg::Vec3d newCameraUp = newRotation * osg::Vec3d( 0.,1.,0. );
>         if( newCameraUp * localUp > 0. )
>         {
>             // apply new rotation
>             rotation = newRotation;
>             return;
>         }
> 
>         my_dy /= 2.;
>         if( ++i == 20 )
>         {
>             rotation = rotation * rotateYaw;
>             return;
>         }
> 
>     } while( true );
> }
> 
> 
> 
> 
> With hopes. 
> Anatoly[/code]


------------------------
Twirling twirling twirling toward freedom

------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=75749#75749







More information about the osg-users mailing list