From b70741a6810b7fe822212dd6fa9110f674a47036 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Mon, 3 Oct 2016 16:54:30 +0300 Subject: [PATCH] Reconstruct base camera object matrix with priority on up vector In VR it's imperative that the camera object matches reality and some applications may have a non-horizontal look vector. The up vector on the other hand should always point up in the user's immediate frame of reference. --- source/headtrackingcamera.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/source/headtrackingcamera.cpp b/source/headtrackingcamera.cpp index 42eedd5..a296639 100644 --- a/source/headtrackingcamera.cpp +++ b/source/headtrackingcamera.cpp @@ -15,7 +15,14 @@ void HeadTrackingCamera::set_elevation_offset(float o) void HeadTrackingCamera::update_from_matrix(const GL::Matrix &hmd_matrix) { - GL::Matrix matrix = base_camera.get_object_matrix()*hmd_matrix; + const GL::Vector3 &up_dir = base_camera.get_up_direction(); + GL::Vector3 right_dir = normalize(cross(base_camera.get_look_direction(), up_dir)); + GL::Vector4 columns[4]; + columns[0] = compose(right_dir, 0.0f); + columns[1] = compose(up_dir, 0.0f); + columns[2] = compose(cross(right_dir, up_dir), 0.0f); + columns[3] = compose(base_camera.get_position(), 1.0f); + GL::Matrix matrix = GL::Matrix::from_columns(columns)*hmd_matrix; set_position(matrix*GL::Vector3()+base_camera.get_up_direction()*elevation_offset); set_look_direction((matrix*GL::Vector4(0, 0, -1, 0)).slice<3>(0)); -- 2.45.2