I have an openGL style matrix (column major, right handed ) that needs to be converted into two vectors (forward and up) I've managed to find, in a weird way, a solution that matches the the coordinates rotation, but if I move the camera there is a mismatch that increases if I'm moving the cam from the world center.
What I do is taking an identity matrix and invert the 1.f values to -1.f (apart from the w axis) and then I multiply it by the cam matrix and then again to the identity matrix like this.
new_base_matrix = (weird identity) * cam_matrix * (weird identity).inverted();
then I multiply the new_base_matrix by the camera eye (cam_matrix w axis), the forward vector (0,0,1) and the up vector (0,1,0).
here is a bit of code:
Matrix4 input_cam__matrix = cam->matrix();
Matrix4 inverted_axis_m = { -1.f, 0, 0, 0,
0, -1.f, 0, 0,
0, 0, -1.f, 0,
0, 0, 0, 1.f };
input_cam__matrix = inverted_axis_m * input_cam__matrix * inverted_axis_m;
//apply rotation scale and pos using the new base
Vector4 pos = input_cam__matrix * Vector4(input_cam__matrix.translation().x, input_cam__matrix.translation().y, input_cam__matrix.translation().z);
Vector4 dir = input_cam__matrix * Vector4(0, 0, 1.f, 0) ;
Vector4 up = input_cam__matrix * Vector4(0, 1.f, 0, 0);
//final vector for the left handed camera
float cam_pos[] = { pos.x, pos.y, pos.z };
float cam_view[] = { dir.x , dir.y, dir.z };
float cam_up[] = { up.x, up.y, up.z };
float fov = 2 * atan(cam->film_height() / (2 * cam->focal_length())) * (180 / M_PI);
I don't know what sign the system that uses the up/forward vectors uses, but I think is +Y on the Y axis. My system, which is the input_camera_matrix is +X+Y+Z .