[Bf-blender-cvs] [0c92bf5e37a] xr-controller-support: XR: Fix viewer pose and teleport calculation

Peter Kim noreply at git.blender.org
Sat Jun 12 12:33:34 CEST 2021


Commit: 0c92bf5e37a86a491810a3b364e9e6456ab5985f
Author: Peter Kim
Date:   Sat Jun 12 19:28:07 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB0c92bf5e37a86a491810a3b364e9e6456ab5985f

XR: Fix viewer pose and teleport calculation

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

M	source/blender/windowmanager/xr/intern/wm_xr_operators.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index 26f76765f74..1ef4bdc01c3 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -338,15 +338,15 @@ static void wm_xr_navigation_teleport(bContext *C,
 
   /* Teleport. */
   if (ob) {
-    float nav_location[3];
+    float nav_location[3], viewer_location[3];
 
-    if (WM_xr_session_state_nav_location_get(xr, nav_location)) {
+    if (WM_xr_session_state_nav_location_get(xr, nav_location) &&
+        WM_xr_session_state_viewer_pose_location_get(xr, viewer_location)) {
       for (int a = 0; a < 3; ++a) {
         if (teleport_axes[a]) {
-          nav_location[a] += teleport_t * (location[a] - nav_location[a]);
+          nav_location[a] += teleport_t * (location[a] - viewer_location[a]);
         }
       }
-      sub_v3_v3(nav_location, xr->runtime->session_state.prev_base_pose.position);
       WM_xr_session_state_nav_location_set(xr, nav_location);
     }
   }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index 16f4f446f41..f0dcb33f76f 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -391,11 +391,11 @@ void wm_xr_session_state_update(const XrSessionSettings *settings,
   const bool use_position_tracking = settings->flag & XR_SESSION_USE_POSITION_TRACKING;
   const bool use_absolute_tracking = settings->flag & XR_SESSION_USE_ABSOLUTE_TRACKING;
   wmXrEyeData *eye = &state->eyes[draw_view->view];
+  float q[4];
 
-  mul_qt_qtqt(viewer_pose.orientation_quat,
-              draw_data->base_pose.orientation_quat,
-              draw_view->local_pose.orientation_quat);
-  copy_v3_v3(viewer_pose.position, draw_data->base_pose.position);
+  mul_qt_qtqt(q, draw_data->base_pose.orientation_quat, draw_view->local_pose.orientation_quat);
+  mul_qt_qtqt(viewer_pose.orientation_quat, q, state->nav_pose.orientation_quat);
+  add_v3_v3v3(viewer_pose.position, draw_data->base_pose.position, state->nav_pose.position);
   /* The local pose and the eye pose (which is copied from an earlier local pose) both are view
    * space, so Y-up. In this case we need them in regular Z-up. */
   if (!use_absolute_tracking) {
@@ -411,7 +411,7 @@ void wm_xr_session_state_update(const XrSessionSettings *settings,
 
   copy_v3_v3(state->viewer_pose.position, viewer_pose.position);
   copy_qt_qt(state->viewer_pose.orientation_quat, viewer_pose.orientation_quat);
-  wm_xr_pose_to_viewmat(&viewer_pose, state->viewer_viewmat);
+  wm_xr_pose_scale_to_viewmat(&viewer_pose, state->nav_scale, state->viewer_viewmat);
 
   /* No idea why, but multiplying by two seems to make it match the VR view more. */
   eye->focal_len = 2.0f *



More information about the Bf-blender-cvs mailing list