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