[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