UNPKG

@pmndrs/xr

Version:
51 lines (50 loc) 1.78 kB
export function createGetXRSpaceMatrix(space, referenceSpace) { return (target, frame) => { if (space === referenceSpace) { target.identity(); return true; } const resolvedReferenceSpace = typeof referenceSpace === 'function' ? referenceSpace() : referenceSpace; if (resolvedReferenceSpace == null) { return false; } const pose = frame?.getPose(space, resolvedReferenceSpace); if (pose == null) { return false; } target.fromArray(pose.transform.matrix); return true; }; } export function getSpaceFromAncestors(object, origin, originReferenceSpace, targetOffsetMatrix) { targetOffsetMatrix?.copy(object.matrix); const result = getXRSpaceFromAncestorsRec(object.parent, targetOffsetMatrix); if (result != null) { return result; } if (targetOffsetMatrix != null) { computeOriginReferenceSpaceOffset(object, origin, targetOffsetMatrix); } return originReferenceSpace; } function computeOriginReferenceSpaceOffset(object, origin, target) { object.updateWorldMatrix(true, false); if (origin == null) { target.copy(object.matrixWorld); return; } origin.updateWorldMatrix(true, false); //origin * offset = space <=> //target = origin.matrixWorld-1 * object.matrixWorld target.copy(origin.matrixWorld).invert().multiply(object.matrixWorld); } function getXRSpaceFromAncestorsRec(object, targetOffsetMatrix) { if (object == null) { return undefined; } if (object.xrSpace != null) { return object.xrSpace; } targetOffsetMatrix?.premultiply(object.matrix); return getXRSpaceFromAncestorsRec(object.parent, targetOffsetMatrix); }