xrFrame_getViewerPose_getPose_identities.https.html (5302B)
1 <!DOCTYPE html> 2 <body> 3 <script src=/resources/testharness.js></script> 4 <script src=/resources/testharnessreport.js></script> 5 <script src="resources/webxr_util.js"></script> 6 <script src="resources/webxr_test_constants.js"></script> 7 <script src="resources/webxr_test_asserts.js"></script> 8 9 <script> 10 11 let testName = "XRFrame getViewerPose(viewerSpace) & getPose(space, space) return identity even during tracking loss"; 12 13 // Use the same device as tracked immersive device, but modify the viewer origin. 14 const deviceInitParams = Object.assign({}, TRACKED_IMMERSIVE_DEVICE, {viewerOrigin: null}); 15 16 // Used when creating a reference space that is offset from local space. 17 // Actual values should not matter for the test. 18 const offsetSpaceTransform = new XRRigidTransform( 19 { x: 1.00, y: -1.50, z: 10.00, w: 1.0 }, 20 { x: 0.27, y: 0.00, z: 0.27, w: 0.92}, // 45 degrees around [1, 0, 1] axis 21 ); 22 23 const expectMatrix = function(pose, expectedMatrix, poseName) { 24 assert_not_equals(pose, null, 25 poseName + " should not be null!"); 26 assert_matrix_approx_equals(pose.transform.matrix, expectedMatrix, 27 poseName + "'s matrix should match expectations!"); 28 assert_false(pose.emulatedPosition, 29 poseName + ".emulatedPosition should be false!"); 30 } 31 32 const expectIdentity = function(pose, poseName) { 33 assert_not_equals(pose, null, 34 poseName + " should not be null!"); 35 assert_matrix_approx_equals(pose.transform.matrix, IDENTITY_MATRIX, 36 poseName + "'s matrix should equal identity!"); 37 assert_false(pose.emulatedPosition, 38 poseName + ".emulatedPosition should be false!"); 39 } 40 41 const testFunction = function(session, fakeDeviceController, t) { 42 // Verify that setting viewerOrigin to null throws TypeError per spec. 43 t.step(() => { 44 assert_throws_js(TypeError, () => { 45 // fakeDeviceController is supplied to the test and should expose the method 46 // that the implementation uses to set the viewer origin. If the API name 47 // differs, adapt this call accordingly. 48 fakeDeviceController.setViewerOrigin(null); 49 }, "fakeDeviceController.setViewerOrigin(null) should throw TypeError"); 50 }); 51 52 return Promise.all([ 53 session.requestReferenceSpace('local'), 54 session.requestReferenceSpace('viewer'), 55 session.requestReferenceSpace('local-floor'), 56 session.requestReferenceSpace('bounded-floor'), 57 session.requestReferenceSpace('unbounded'), 58 session.requestReferenceSpace('local'), 59 ]).then((allSpaces) => new Promise((resolve, reject) => { 60 const [ 61 localSpace1, 62 viewerSpace, 63 localFloorSpace, 64 boundedFloorSpace, 65 unboundedSpace, 66 localSpace2] = allSpaces; 67 68 const offsetLocalSpace1 = localSpace1.getOffsetReferenceSpace(offsetSpaceTransform); 69 const offsetLocalSpace2 = localSpace2.getOffsetReferenceSpace(offsetSpaceTransform); 70 const offsetViewerSpace = viewerSpace.getOffsetReferenceSpace(offsetSpaceTransform); 71 72 // Throw in an offset space: 73 allSpaces.push(offsetLocalSpace1); 74 75 function onFrame(time, frame) { 76 // Expect identities: 77 const viewerFromViewer1 = frame.getViewerPose(viewerSpace); 78 79 const localFromLocalDifferentAddress = frame.getPose(localSpace1, localSpace2); 80 const offsetFromOffsetDifferentAddress = frame.getPose(offsetLocalSpace1, offsetLocalSpace2); 81 82 t.step(() => { 83 expectIdentity(viewerFromViewer1, "viewerFromViewer1"); 84 expectIdentity(localFromLocalDifferentAddress, "localFromLocalDifferentAddress"); 85 expectIdentity(offsetFromOffsetDifferentAddress, "offsetFromOffsetDifferentAddress"); 86 }); 87 88 // Expect offsetSpaceTransform: 89 const viewerFromViewer2 = frame.getViewerPose(offsetViewerSpace); 90 91 const viewerFromOffset2 = frame.getPose(offsetViewerSpace, viewerSpace); 92 const localFromOffset1 = frame.getPose(offsetLocalSpace1, localSpace1); 93 const localFromOffset2 = frame.getPose(offsetLocalSpace2, localSpace1); 94 95 t.step(() => { 96 expectMatrix(viewerFromViewer2, offsetSpaceTransform.matrix, "viewerFromViewer2"); 97 expectMatrix(viewerFromOffset2, offsetSpaceTransform.matrix, "viewerFromOffset2"); 98 expectMatrix(localFromOffset1, offsetSpaceTransform.matrix, "localFromOffset1"); 99 expectMatrix(localFromOffset2, offsetSpaceTransform.matrix, "localFromOffset2"); 100 }); 101 102 // Expect identities: 103 allSpaces.forEach((space, index) => { 104 const pose = frame.getPose(space, space); 105 t.step(() => { 106 expectIdentity(pose, "pose[" + index +"]"); 107 }); 108 }); 109 110 resolve(); 111 } 112 113 session.requestAnimationFrame(onFrame); 114 })); 115 }; 116 117 xr_session_promise_test(testName, testFunction, 118 deviceInitParams, 'immersive-vr', { 119 requiredFeatures: ["local", "local-floor", "bounded-floor", "unbounded"] 120 }); 121 122 </script> 123 </body>