]> git.tdb.fi Git - libs/vr.git/blob - source/headtrackingcamera.cpp
Reconstruct base camera object matrix with priority on up vector
[libs/vr.git] / source / headtrackingcamera.cpp
1 #include "headtrackingcamera.h"
2
3 namespace Msp {
4 namespace VR {
5
6 HeadTrackingCamera::HeadTrackingCamera(const GL::Camera &c):
7         base_camera(c),
8         elevation_offset(0)
9 { }
10
11 void HeadTrackingCamera::set_elevation_offset(float o)
12 {
13         elevation_offset = o;
14 }
15
16 void HeadTrackingCamera::update_from_matrix(const GL::Matrix &hmd_matrix)
17 {
18         const GL::Vector3 &up_dir = base_camera.get_up_direction();
19         GL::Vector3 right_dir = normalize(cross(base_camera.get_look_direction(), up_dir));
20         GL::Vector4 columns[4];
21         columns[0] = compose(right_dir, 0.0f);
22         columns[1] = compose(up_dir, 0.0f);
23         columns[2] = compose(cross(right_dir, up_dir), 0.0f);
24         columns[3] = compose(base_camera.get_position(), 1.0f);
25         GL::Matrix matrix = GL::Matrix::from_columns(columns)*hmd_matrix;
26
27         set_position(matrix*GL::Vector3()+base_camera.get_up_direction()*elevation_offset);
28         set_look_direction((matrix*GL::Vector4(0, 0, -1, 0)).slice<3>(0));
29         set_up_direction((matrix*GL::Vector4(0, 1, 0, 0)).slice<3>(0));
30
31         set_depth_clip(base_camera.get_near_clip(), base_camera.get_far_clip());
32         set_field_of_view(base_camera.get_field_of_view());
33         set_aspect(base_camera.get_aspect());
34 }
35
36 } // namespace VR
37 } // namespace Msp