# HG changeset patch # User John Tsiombikas # Date 1379648979 -10800 # Node ID b2abb08c8f9492f3c288af46c0e35374bb662165 # Parent b66b54a68dfd625133a2dffdb036cd9fd10b1f8f proper FPS-style vr tracking diff -r b66b54a68dfd -r b2abb08c8f94 src/camera.cc --- a/src/camera.cc Thu Sep 19 06:36:48 2013 +0300 +++ b/src/camera.cc Fri Sep 20 06:49:39 2013 +0300 @@ -1,8 +1,10 @@ #include "opengl.h" #include "camera.h" +#include "vr.h" Camera::Camera() { + roll = 0.0; inval_cache(); } @@ -75,11 +77,13 @@ mat->translate(Vector3(0, 0, -rad)); mat->rotate(Vector3(phi, 0, 0)); mat->rotate(Vector3(0, theta, 0)); + mat->rotate(Vector3(0, 0, roll)); } void OrbitCamera::calc_inv_matrix(Matrix4x4 *mat) const { mat->reset_identity(); + mat->rotate(Vector3(0, 0, roll)); mat->rotate(Vector3(0, theta, 0)); mat->rotate(Vector3(phi, 0, 0)); mat->translate(Vector3(0, 0, -rad)); @@ -89,6 +93,7 @@ { theta += y; phi += x; + roll += z; if(phi < -M_PI / 2) phi = -M_PI / 2; @@ -107,18 +112,19 @@ inval_cache(); } - void FpsCamera::calc_matrix(Matrix4x4 *mat) const { mat->reset_identity(); mat->translate(Vector3(pos.x, pos.y, pos.z)); mat->rotate(Vector3(0, theta, 0)); mat->rotate(Vector3(phi, 0, 0)); + mat->rotate(Vector3(0, 0, roll)); } void FpsCamera::calc_inv_matrix(Matrix4x4 *mat) const { mat->reset_identity(); + mat->rotate(Vector3(0, 0, roll)); mat->rotate(Vector3(phi, 0, 0)); mat->rotate(Vector3(0, theta, 0)); mat->translate(Vector3(-pos.x, -pos.y, -pos.z)); @@ -186,3 +192,20 @@ inval_cache(); } + + +// --- VR additions --- + +void VRFpsCamera::track_vr() +{ + float euler[3]; + vr_get_rotation_euler(euler); + + // input_rotate invalidates cache + input_rotate(prev_angles[0] - euler[0], prev_angles[1] - euler[1], prev_angles[2] - euler[2]); + + prev_angles[0] = euler[0]; + prev_angles[1] = euler[1]; + prev_angles[2] = euler[2]; +} + diff -r b66b54a68dfd -r b2abb08c8f94 src/camera.h --- a/src/camera.h Thu Sep 19 06:36:48 2013 +0300 +++ b/src/camera.h Fri Sep 20 06:49:39 2013 +0300 @@ -5,6 +5,8 @@ class Camera { protected: + float roll; + mutable struct { bool valid; Matrix4x4 mat; @@ -79,4 +81,12 @@ }; +class VRFpsCamera : public FpsCamera { +private: + float prev_angles[3]; + +public: + void track_vr(); +}; + #endif // CAMERA_H_ diff -r b66b54a68dfd -r b2abb08c8f94 src/main.cc --- a/src/main.cc Thu Sep 19 06:36:48 2013 +0300 +++ b/src/main.cc Fri Sep 20 06:49:39 2013 +0300 @@ -20,7 +20,7 @@ static void sball_rotate(int rx, int ry, int rz); static bool parse_args(int argc, char **argv); -static FpsCamera cam; +static VRFpsCamera cam; static int width, height; static bool use_vr = false; static bool mouselook = false; @@ -90,21 +90,6 @@ { unsigned int msec = glutGet(GLUT_ELAPSED_TIME); - // test rift sensor - float quat[4], euler[3]; - - vr_get_rotation(quat); - vr_get_rotation_euler(euler); - - Quaternion qrot(quat[3], quat[0], quat[1], quat[2]); - - static unsigned int prev_print; - if(msec - prev_print > 1000) { - printf("q(%.3f + %.3fi + %.3fj + %.3fk)", quat[3], quat[0], quat[1], quat[2]); - printf(" - euler(%.3f %.3f %.3f)\n", euler[0], euler[1], euler[2]); - prev_print = msec; - } - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); @@ -114,9 +99,7 @@ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - Matrix4x4 mat = qrot.inverse().get_rotation_matrix(); - load_matrix(mat); - + cam.track_vr(); cam.use_inverse(); draw_scene();