[osg-users] Problem converting yaw,pitch,roll to quaternion

Guido Knapen guidoknapen at gmail.com
Thu Sep 3 08:09:31 PDT 2015


Hello everybody.

I'm new to this forum. For 16 hours I've been trying to solve my problem with no success. I've tried several different methods to convert but all fail.

Basicly I have this code to put some testing arrows in my scene which demonstrate yaw, pitch and roll.


Code:

for(int y = 0; y < 4; y++) // Vertical stuff
      {
    	  char *ID = 0;
    	  float lat = 50.0 - 0.1f * y;
    	  bool increaseYaw = false;
    	  bool increasePitch = false;
    	  bool increaseRoll = false;

    	  switch(y)
    	  {
    	  case 0:
    		  increaseYaw = true;
    		  ID = "YAW";
    		  break;
    	  case 1:
    		  increasePitch = true;
    		  ID = "PITCH";
    		  break;
    	  case 2:
    		  increaseRoll = true;
    		  ID = "ROLL";
    		  break;
    	  case 3:
    		  increaseYaw = true;
    		  increasePitch = true;
    		  ID = "YAW AND PITCH";
    		  break;
    	  case 4:
    		  increaseYaw = true;
    		  increaseRoll = true;
    		  ID = "YAW AND ROLL";
    		  break;
    	  case 5:
    		  increasePitch = true;
    		  increaseRoll = true;
    		  ID = "PITCH AND ROLL";
    		  break;
    	  case 6:
    		  increaseYaw = true;
    		  increasePitch = true;
    		  increaseRoll = true;
    		  ID = "YAW, PITCH AND ROLL";
    		  break;
    	  }

    	  float yaw = 0.0f;
	      float pitch = 0.0f;
		  float roll = 0.0f;

		  for(int x = 0; x < 8; x++) // Horizontal stuff
		  {
			  float lon = 6.0f + 0.1f * x;

			  GuiLibViewerEntity *ve = mViewer->createViewerEntity( // align
		               ID,// align
		               GuiLib::GuiLibPosition(lat, lon, 1000.0), // align
		               20.0, // align
		               path, // align
		               x == 0);
		      ve->setRotationRadians(yaw, pitch, roll);
		      ve->setAutoScale(mAutoScale);

			  if(increaseYaw)
			  {
				  yaw += osg::PI / 4;
			  }

			  if(increasePitch)
			  {
				  pitch += osg::PI / 4;
			  }

			  if(increaseRoll)
			  {
				  roll += osg::PI / 4;
			  }
		  }
      }




However my setRotationRadius does not work properly. One of methods which got me the closest to the proper result is this one:


Code:

void ViewerEntity::setRotationRadians(
         float aYaw,
         float aPitch,
         float aRoll) {

osg::Matrixd mat;
	   mat.makeRotate(aPitch, PITCH_VEC, aYaw, YAW_VEC, aRoll, ROLL_VEC);

	   mModel->setLocalRotation (mat.getRotate());
}




Which generates this:
/file/d/0B7qBNqPzsL5PMWx1ZjVRR0VHbms/view?usp=sharing

EDIT: apparently I cant post images. however that's a google drive image feel free to add that to the google drive url.

As you can see the yaw, pitch and roll individually are rotated correctly. However when the yaw and pitch are combined the arrows which have a red circle around them have their yaw wrong by 180 degrees.

Can anybody please help me out?

Thanks in advance

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








More information about the osg-users mailing list