From ea3609b42e7be5fe2f1d0e1b7953116783ce856a Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Fri, 5 Apr 2019 18:42:57 -0700 Subject: [PATCH] Add some math verifying relationship between get_viewer_pose and get_pose --- components/script/dom/xrreferencespace.rs | 10 ++++++-- .../script/dom/xrstationaryreferencespace.rs | 24 +++++++++++++++---- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/components/script/dom/xrreferencespace.rs b/components/script/dom/xrreferencespace.rs index 804768eee69..664dc4f0e23 100644 --- a/components/script/dom/xrreferencespace.rs +++ b/components/script/dom/xrreferencespace.rs @@ -56,12 +56,18 @@ impl XRReferenceSpaceMethods for XRReferenceSpace { impl XRReferenceSpace { /// Gets pose of the viewer with respect to this space /// - /// This is equivalent to `get_pose(self).inverse() * get_pose(viewerSpace)`, however - /// we specialize it to be efficient + /// This is equivalent to `get_pose(self).inverse() * get_pose(viewerSpace)` (in column vector notation), + /// however we specialize it to be efficient pub fn get_viewer_pose(&self, base_pose: &WebVRFrameData) -> RigidTransform3D { let pose = self.get_unoffset_viewer_pose(base_pose); // This may change, see https://github.com/immersive-web/webxr/issues/567 + + // in column-vector notation, + // get_viewer_pose(space) = get_pose(space).inverse() * get_pose(viewer_space) + // = (get_unoffset_pose(space) * offset).inverse() * get_pose(viewer_space) + // = offset.inverse() * get_unoffset_pose(space).inverse() * get_pose(viewer_space) + // = offset.inverse() * get_unoffset_viewer_pose(space) let offset = self.transform.get().transform(); let inverse = offset.inverse(); inverse.pre_mul(&pose) diff --git a/components/script/dom/xrstationaryreferencespace.rs b/components/script/dom/xrstationaryreferencespace.rs index 8b0301dfd01..a867aa0d976 100644 --- a/components/script/dom/xrstationaryreferencespace.rs +++ b/components/script/dom/xrstationaryreferencespace.rs @@ -56,25 +56,41 @@ impl XRStationaryReferenceSpace { /// Does not apply originOffset, use get_viewer_pose on XRReferenceSpace instead pub fn get_unoffset_viewer_pose(&self, viewer_pose: &WebVRFrameData) -> RigidTransform3D { let viewer_pose = XRSpace::viewer_pose_from_frame_data(viewer_pose); + // all math is in column-vector notation + // we use the following equation to verify correctness here: + // get_viewer_pose(space) = get_pose(space).inverse() * get_pose(viewer_space) match self.ty { XRStationaryReferenceSpaceSubtype::Eye_level => { + // get_viewer_pose(eye_level) = get_pose(eye_level).inverse() * get_pose(viewer_space) + // = I * viewer_pose + // = viewer_pose + // we get viewer poses in eye-level space by default viewer_pose - } + }, XRStationaryReferenceSpaceSubtype::Floor_level => { // XXXManishearth support getting floor info from stage parameters + // get_viewer_pose(floor_level) = get_pose(floor_level).inverse() * get_pose(viewer_space) + // = Translate(-2).inverse() * viewer_pose + // = Translate(2) * viewer_pose + // assume approximate user height of 2 meters let floor_to_eye: RigidTransform3D = Vector3D::new(0., 2., 0.).into(); floor_to_eye.pre_mul(&viewer_pose) - } + }, XRStationaryReferenceSpaceSubtype::Position_disabled => { + // get_viewer_pose(pos_disabled) = get_pose(pos_disabled).inverse() * get_pose(viewer_space) + // = viewer_pose.translation.inverse() * viewer_pose + // = viewer_pose.translation.inverse() * viewer_pose.translation + // * viewer_pose.rotation + // = viewer_pose.rotation + // This space follows the user around, but does not mirror the user's orientation // Thus, the viewer's pose relative to this space is simply their orientation viewer_pose.rotation.into() - } + }, } - } /// Gets pose represented by this space