xrFrame_getPose.https.html (3120B)
1 <!DOCTYPE html> 2 <script src="/resources/testharness.js"></script> 3 <script src="/resources/testharnessreport.js"></script> 4 <script src="resources/webxr_test_constants.js"></script> 5 <script src="resources/webxr_util.js"></script> 6 <script src="resources/webxr_test_asserts.js"></script> 7 8 <script> 9 10 let immersiveTestName = "XRFrame.getPose works for immersive sessions"; 11 let nonImmersiveTestName = "XRFrame.getPose works for non-immersive sessions"; 12 13 let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE; 14 15 let testFunction = function(session, fakeDeviceController, t) { 16 return Promise.all([ 17 session.requestReferenceSpace('local'), 18 session.requestReferenceSpace('local') 19 ]).then((spaces) => new Promise((resolve) => { 20 function onFrame(time, xrFrame) { 21 const radians = Math.PI / 2.0; // 90 degrees 22 23 // Both eye-level spaces start out with originOffset = identity matrix. 24 let space1 = spaces[0]; 25 let space2 = spaces[1]; 26 27 let offset = new XRRigidTransform( 28 DOMPointReadOnly.fromPoint({ 29 x: 2, 30 y: 3, 31 z: 4, 32 w: 1, 33 })); 34 35 let translatedSpace1 = space1.getOffsetReferenceSpace(offset); 36 let translated_from_base = xrFrame.getPose(translatedSpace1, space1); 37 38 // Getting the transform of an offset space from the space it was based on 39 // should be the same as the initially applied offset. 40 t.step(() => { 41 assert_matrix_approx_equals(translated_from_base.transform.matrix, offset.matrix, FLOAT_EPSILON); 42 }); 43 44 // Rotate 90 degrees about x axis, then move 1 meter along y axis. 45 space1 = space1.getOffsetReferenceSpace(new XRRigidTransform( 46 DOMPointReadOnly.fromPoint({ 47 x : 0, 48 y : 1, 49 z : 0, 50 w : 1 51 }), 52 DOMPointReadOnly.fromPoint({ 53 x : Math.sin(radians / 2), 54 y : 0, 55 z : 0, 56 w : Math.cos(radians / 2) 57 }) 58 )); 59 60 // Rotate 90 degrees about z axis, then move 1 meter along x axis. 61 space2 = space2.getOffsetReferenceSpace(new XRRigidTransform( 62 DOMPointReadOnly.fromPoint({ 63 x : 1, 64 y : 0, 65 z : 0, 66 w : 1 67 }), 68 DOMPointReadOnly.fromPoint({ 69 x : 0, 70 y : 0, 71 z : Math.sin(radians / 2), 72 w : Math.cos(radians / 2) 73 }) 74 )); 75 76 let space2_from_space1 = xrFrame.getPose(space1, space2); 77 const EXPECTED_POSE_MATRIX = [ 78 0, -1, 0, 0, // 1st column 79 0, 0, 1, 0, // 2nd column 80 -1, 0, 0, 0, // 3rd column 81 1, 1, 0, 1 // 4th column 82 ]; 83 84 t.step(() => { 85 assert_matrix_approx_equals(space2_from_space1.transform.matrix, EXPECTED_POSE_MATRIX, FLOAT_EPSILON); 86 }); 87 88 // Finished test. 89 resolve(); 90 } 91 92 session.requestAnimationFrame(onFrame); 93 })); 94 }; 95 96 xr_session_promise_test(immersiveTestName, testFunction, 97 fakeDeviceInitParams, 'immersive-vr'); 98 xr_session_promise_test(nonImmersiveTestName, testFunction, 99 fakeDeviceInitParams, 'inline', { 'requiredFeatures': ['local'] }); 100 101 </script>