UNPKG

@pmndrs/xr

Version:
46 lines (45 loc) 2.06 kB
import { Matrix4, Quaternion, Vector3 } from 'three'; import { toDOMPointInit } from './utils.js'; const OneVector = new Vector3(1, 1, 1); const ZeroVector = new Vector3(0, 0, 0); const NeutralQuaternion = new Quaternion(); const matrixHelper1 = new Matrix4(); const matrixHelper2 = new Matrix4(); const quaternionHelper = new Quaternion(); const positionHelper = new Vector3(); const vectorHelper = new Vector3(); export async function requestXRAnchor(store, options) { if (options.relativeTo === 'hit-test-result') { return options.hitTestResult.createAnchor?.(new XRRigidTransform(toDOMPointInit(options.offsetPosition), toDOMPointInit(options.offsetQuaternion))); } let frame; let space; if (options.relativeTo === 'world') { frame = options.frame ?? (await store.requestFrame()); const { origin, originReferenceSpace } = store.getState(); if (originReferenceSpace == null) { return undefined; } space = originReferenceSpace; const { worldPosition, worldQuaternion } = options; if (origin != null) { //compute vectorHelper and quaternionHelper in the local space of the origin origin.updateWorldMatrix(true, false); matrixHelper1.copy(origin.matrixWorld).invert(); matrixHelper2.compose(worldPosition, worldQuaternion, OneVector).multiply(matrixHelper1); matrixHelper2.decompose(positionHelper, quaternionHelper, vectorHelper); } else { positionHelper.copy(worldPosition); quaternionHelper.copy(worldQuaternion); } } else { frame = options.frame ?? (await store.requestFrame()); space = options.space; const { offsetPosition, offsetQuaternion } = options; positionHelper.copy(offsetPosition ?? ZeroVector); quaternionHelper.copy(offsetQuaternion ?? NeutralQuaternion); } return frame.createAnchor?.(new XRRigidTransform(toDOMPointInit(positionHelper), toDOMPointInit(quaternionHelper)), space); }