How to calculate camera roll...


I have hopefully a simple question regarding calculating the roll of a camera.

I can calculate the yaw and pitch just fine using GLM:

CameraAxis = glm::cross(DirectionOfWhereCameraIsFacing, DirectionOfUpForPerson);
CameraQuatPitch = glm::angleAxis(CurrentCameraViewingSettings.Pitch, CameraAxis);
CameraQuatYaw = glm::angleAxis(CurrentCameraViewingSettings.Yaw, DirectionOfUpForPerson);

The first problem is calculating the roll of the camera. I tried this but my math is off as this doesn’t work:

CameraQuatRoll = glm::angleAxis(CurrentCameraViewingSettings.Roll, CameraAxis);

This seems to me like another pitch calculation.

The second piece is accuratly combining the changed roll to find out where the camera is finally facing.

I do this for the yaw and pitch above by doing the following below:

CameraQuatBothPitchAndYaw = glm::cross(CameraQuatPitch, CameraQuatYaw);
CameraQuatBothPitchAndYaw = glm::normalize(CameraQuatBothPitchAndYaw);
DirectionOfWhereCameraIsFacing = glm::rotate(CameraQuatBothPitchAndYaw, DirectionOfWhereCameraIsFacing);

How do I also incorporate roll into this?

Thank you for your time.

Your 3 axes that you should be rotating around are DirectionOfWhereCameraIsFacing (roll), DirectionOfUpForPerson (yaw) & CameraAxis (pitch),so you need to change CameraAxis to DirectionOfWhereCameraIsFacing in your roll calculation.

I believe to combine the 3 rotations you just multiply the quaternions:

CombinedRotation = CameraQuatYaw * (CameraQuatPitch* CameraQuatRoll);// or is it roll*(pitch*yaw)?

Depending on what you’re after, you might actually want to roll/pitch/yaw around (1,0,0), (0,1,0) & (0,0,1) axes instead.

Thanks, I will give this a shot.