@pmndrs/xr
Version:
VR/AR for threejs
46 lines (45 loc) • 2.06 kB
JavaScript
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);
}