Jump to content
  • Advertisement
Sign in to follow this  
tmason

OpenGL Correcting Orientation from external source (Oculus Rift)

This topic is 1551 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello,

So I have a weird issue with orientation when I am pulling orientation data from an external device, in this case the Oculus Rift.

Essentially I can get the correct position without an issue but my orientation is screwed up such that either looking up means I am looking down in the OpenGL environment OR looking left means I am looking right in the environment.

Obviously I would like it such that I am looking in the right direction at all times.

So, here is my code example:
 
glm::mat4 BulletOrientationMatrix = glm::mat4(1.0f);

ovrMatrix4f OculusRiftOrientation = OVR::Matrix4f(Current_HeadPose[EyeToCalculate].Orientation).Inverted();

for (int o = 0; o < 4; o++) {
	for (int i = 0; i < 4; i++) {
		BulletOrientationMatrix[o][i] = OculusRiftOrientation.M[o][i];
	}
}

AdjustedPitch += HorizontalAngle;

HorizontalAngle = 0;

BulletOrientationMatrix = glm::transpose(BulletOrientationMatrix);

BulletOrientationMatrix = glm::rotate(BulletOrientationMatrix, AdjustedPitch, glm::vec3(0.0f, 1.0f, 0.0f));
As you can see, I copy over the orientation data from the Rift's SDK and then do corrections on it.

I am sure I am doing it in the wrong order or something; but I tried the code above with/without the inversion and vice versa with the "glm::transpose" call.

Is there something that maybe someone else sees in the code above that I am doing wrong?

Thank you for your time. Edited by tmason

Share this post


Link to post
Share on other sites
Advertisement
OK, so an update on this;

I have corrected most head movement with the following code but a minor issue remains; will ask below.

OculusToGLMMatrix = glm::mat4(1.0f);

ovrMatrix4f OculusRiftOrientation = OVR::Matrix4f(Current_HeadPose[EyeToCalculate].Orientation);

for (int o = 0; o < 4; o++) {
	for (int i = 0; i < 4; i++) {
		OculusToGLMMatrix[o][i] = OculusRiftOrientation.M[o][i];
	}
}

/*

The AdjustedPitch stays a certain value such that when the person moves their mouse the resultant rotation inside the
3D environment is added/subtracted from the Adjusted pitch.

In this way the person can rotate using the mouse and the Oculus Rift device freely.

*/

AdjustedPitch += HorizontalAngle;

HorizontalAngle *= CurrentMouseMovementSpeed * (*deltaTime);

OculusToGLMMatrix = glm::transpose(OculusToGLMMatrix);

/*

Change the "handedness" of the rotation using the following Rotation Fix matrix.

*/

GLfloat* RotationFixArray = new GLfloat[16] { 1.0f, 0.0f, 0.0f, 0.0f,
		0.0f, 1.0f, 0.0f, 0.0f,
		0.0f, 0.0f, -1.0f, 0.0f,
		0.0f, 0.0f, 0.0f, 1.0f };

glm::mat4 RotationFixOrientation = glm::make_mat4(RotationFixArray);

OculusToGLMMatrix *= RotationFixOrientation;

OculusToGLMMatrix = glm::rotate(OculusToGLMMatrix, AdjustedPitch, glm::vec3(0.0f, 1.0f, 0.0f));

CurrentRightDirection = glm::vec3(OculusToGLMMatrix[0][0], OculusToGLMMatrix[1][0], OculusToGLMMatrix[2][0]);

CurrentUpDirection = glm::vec3(OculusToGLMMatrix[0][1], OculusToGLMMatrix[1][1], OculusToGLMMatrix[2][1]);

CurrentViewingDirection = glm::vec3(OculusToGLMMatrix[0][2], OculusToGLMMatrix[1][2], OculusToGLMMatrix[2][2]);

/*

View adjusted position is from prior calculations based on the position of the eyes and the position of the device relative to the computer.

*/

CurrentCameraMatrix = glm::lookAt(ViewAdjustedPosition, ViewAdjustedPosition + CurrentViewingDirection, CurrentUpDirection);

With the above code up/down and left/right 100% works.

Share this post


Link to post
Share on other sites
The problem with the above code is that head tilting is not working.

The Oculus Rift tracks not just head movement but head tilting.

Currently with the above code when you TILT your head left you tilt right and vice versa.

Is there anything I can do to fix that based on what you see above?

Thank you.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!