[Bf-blender-cvs] [43a1310508] HMD_viewport: Fixes Oculus CV1 Lens Correction

Joey Ferwerda noreply at git.blender.org
Fri Mar 24 05:57:27 CET 2017


Commit: 43a1310508bb083aad8ad2b65def9e8d05ea6e57
Author: Joey Ferwerda
Date:   Fri Mar 24 05:57:03 2017 +0100
Branches: HMD_viewport
https://developer.blender.org/rB43a1310508bb083aad8ad2b65def9e8d05ea6e57

Fixes Oculus CV1 Lens Correction

===================================================================

M	extern/openhmd/src/drv_oculus_rift/rift.c
M	extern/openhmd/src/openhmd.c
M	extern/openhmd/src/openhmdi.h

===================================================================

diff --git a/extern/openhmd/src/drv_oculus_rift/rift.c b/extern/openhmd/src/drv_oculus_rift/rift.c
index caf367eb24..bc4bddac5d 100644
--- a/extern/openhmd/src/drv_oculus_rift/rift.c
+++ b/extern/openhmd/src/drv_oculus_rift/rift.c
@@ -320,23 +320,19 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	//setup generic distortion coeffs, from hand-calibration
 	switch (desc->revision) {
 		case REV_DK2:
-			priv->base.properties.universal_distortion_k[0] = 0.247;
-			priv->base.properties.universal_distortion_k[1] = -0.145;
-			priv->base.properties.universal_distortion_k[2] = 0.103;
-			priv->base.properties.universal_distortion_k[3] = 0.795;
-			priv->base.properties.universal_aberration_k[0] = 0.985;
-			priv->base.properties.universal_aberration_k[1] = 1.000;
-			priv->base.properties.universal_aberration_k[2] = 1.015;
+			ohmd_set_universal_distortion_k(&(priv->base.properties), 0.247, -0.145, 0.103, 0.795);
+			ohmd_set_universal_aberration_k(&(priv->base.properties), 0.985, 1.000, 1.015);
 			break;
 		case REV_DK1:
-			priv->base.properties.universal_distortion_k[0] = 1.003;
-			priv->base.properties.universal_distortion_k[1] = -1.005;
-			priv->base.properties.universal_distortion_k[2] = 0.403;
-			priv->base.properties.universal_distortion_k[3] = 0.599;
-			priv->base.properties.universal_aberration_k[0] = 0.985;
-			priv->base.properties.universal_aberration_k[1] = 1.000;
-			priv->base.properties.universal_aberration_k[2] = 1.015;
+			ohmd_set_universal_distortion_k(&(priv->base.properties), 1.003, -1.005, 0.403, 0.599);
+			ohmd_set_universal_aberration_k(&(priv->base.properties), 0.985, 1.000, 1.015);
 			break;
+		case REV_CV1:
+			ohmd_set_universal_distortion_k(&(priv->base.properties), 0.098, .324, -0.241, 0.819);
+			ohmd_set_universal_aberration_k(&(priv->base.properties), 0.9952420, 1.0, 1.0008074);
+			/* CV1 reports IPD, but not lens center, at least not anywhere I could find, so use the manually measured value of 0.054 */
+			priv->display_info.lens_separation = 0.054;
+			priv->base.properties.lens_sep = priv->display_info.lens_separation;
 		default:
 			break;
 	}
@@ -344,9 +340,6 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	// calculate projection eye projection matrices from the device properties
 	//ohmd_calc_default_proj_matrices(&priv->base.properties);
 	float l,r,t,b,n,f;
-	mat4x4f l_proj; // left projection matrix
-	mat4x4f r_proj; // right projection matrix
-	mat4x4f translate;
 	// left eye screen bounds
 	l = -1.0f * (priv->display_info.h_screen_size/2 - priv->display_info.lens_separation/2);
 	r = priv->display_info.lens_separation/2;
@@ -355,18 +348,16 @@ static ohmd_device* open_device(ohmd_driver* driver, ohmd_device_desc* desc)
 	n = priv->display_info.eye_to_screen_distance[0];
 	f = n*10e6;
 	//LOGD("l: %0.3f, r: %0.3f, b: %0.3f, t: %0.3f, n: %0.3f, f: %0.3f", l,r,b,t,n,f);
-	omat4x4f_init_frustum(&l_proj, l, r, b, t, n, f);
-	omat4x4f_init_translate(&translate, r, 0, 0); //shift over eye offset
-	omat4x4f_mult(&translate, &l_proj, &priv->base.properties.proj_left); //LEFT multiply inside OpenHMD
+	/* eye separation is handled by IPD in the Modelview matrix */
+	omat4x4f_init_frustum(&priv->base.properties.proj_left, l, r, b, t, n, f);
 	//right eye screen bounds
 	l = -1.0f * priv->display_info.lens_separation/2;
 	r = priv->display_info.h_screen_size/2 - priv->display_info.lens_separation/2;
 	n = priv->display_info.eye_to_screen_distance[1];
 	f = n*10e6;
 	//LOGD("l: %0.3f, r: %0.3f, b: %0.3f, t: %0.3f, n: %0.3f, f: %0.3f", l,r,b,t,n,f);
-	omat4x4f_init_frustum(&r_proj, l, r, b, t, n, f);
-	omat4x4f_init_translate(&translate, l, 0, 0); //shift over eye offset
-	omat4x4f_mult(&translate, &r_proj, &priv->base.properties.proj_right); //LEFT multiply inside OpenHMD
+	/* eye separation is handled by IPD in the Modelview matrix */
+	omat4x4f_init_frustum(&priv->base.properties.proj_right, l, r, b, t, n, f);
 
 	priv->base.properties.fov = 2 * atan2f(
 			priv->display_info.h_screen_size/2 - priv->display_info.lens_separation/2,
diff --git a/extern/openhmd/src/openhmd.c b/extern/openhmd/src/openhmd.c
index 067f3b4911..99595ff969 100644
--- a/extern/openhmd/src/openhmd.c
+++ b/extern/openhmd/src/openhmd.c
@@ -523,13 +523,8 @@ void ohmd_set_default_device_properties(ohmd_device_properties* props)
 	props->ipd = 0.061f;
 	props->znear = 0.1f;
 	props->zfar = 1000.0f;
-	props->universal_distortion_k[0] = 0.0;
-	props->universal_distortion_k[1] = 0.0;
-	props->universal_distortion_k[2] = 0.0;
-	props->universal_distortion_k[3] = 1.0;
-	props->universal_aberration_k[0] = 1.0;
-	props->universal_aberration_k[1] = 1.0;
-	props->universal_aberration_k[2] = 1.0;
+	ohmd_set_universal_distortion_k(props, 0, 0, 0, 1);
+	ohmd_set_universal_aberration_k(props, 1.0, 1.0, 1.0);
 }
 
 void ohmd_calc_default_proj_matrices(ohmd_device_properties* props)
@@ -560,3 +555,18 @@ void ohmd_calc_default_proj_matrices(ohmd_device_properties* props)
 	omat4x4f_init_translate(&translate, -proj_offset, 0, 0);
 	omat4x4f_mult(&translate, &proj_base, &props->proj_right);
 }
+
+void ohmd_set_universal_distortion_k(ohmd_device_properties* props, float a, float b, float c, float d)
+{
+	props->universal_distortion_k[0] = a;
+	props->universal_distortion_k[1] = b;
+	props->universal_distortion_k[2] = c;
+	props->universal_distortion_k[3] = d;
+}
+
+void ohmd_set_universal_aberration_k(ohmd_device_properties* props, float r, float g, float b)
+{
+	props->universal_aberration_k[0] = r;
+	props->universal_aberration_k[1] = g;
+	props->universal_aberration_k[2] = b;
+}
\ No newline at end of file
diff --git a/extern/openhmd/src/openhmdi.h b/extern/openhmd/src/openhmdi.h
index a15a1ba054..d023edc9cd 100644
--- a/extern/openhmd/src/openhmdi.h
+++ b/extern/openhmd/src/openhmdi.h
@@ -133,6 +133,8 @@ struct ohmd_context {
 // helper functions
 void ohmd_set_default_device_properties(ohmd_device_properties* props);
 void ohmd_calc_default_proj_matrices(ohmd_device_properties* props);
+void ohmd_set_universal_distortion_k(ohmd_device_properties* props, float a, float b, float c, float d);
+void ohmd_set_universal_aberration_k(ohmd_device_properties* props, float r, float g, float b);
 
 // drivers
 ohmd_driver* ohmd_create_dummy_drv(ohmd_context* ctx);




More information about the Bf-blender-cvs mailing list