Signatur
Beschreibung
Das Interface XRRay stammt aus dem WebXR Hit Test Module. Es beschreibt einen Strahl, der an einem Punkt im 3D-Raum beginnt und in eine Richtung unendlich weiterläuft. Solche Strahlen nutzt man in AR-Anwendungen vor allem, um herauszufinden, wo ein gedachter Strahl – etwa von der Kamera oder einem Controller aus – eine erkannte reale Fläche (Boden, Tisch, Wand) trifft.
Einen Strahl erzeugt man mit new XRRay(), entweder aus einem Ursprung und einer Richtung (beides DOMPointInit) oder aus einer XRRigidTransform. Ohne Argumente beginnt der Strahl im Koordinatenursprung {x: 0, y: 0, z: 0, w: 1} und zeigt entlang der negativen Z-Achse {x: 0, y: 0, z: -1, w: 0}, also „nach vorne“ aus Sicht des jeweiligen Referenzraums.
Eigenschaften (alle nur lesbar):
origin– einDOMPointReadOnlymit dem Startpunkt (wist immer1).direction– einDOMPointReadOnlymit dem normierten Richtungsvektor (wist immer0).matrix– einFloat32Arraymit 16 Werten (4×4-Matrix, spaltenweise). Sie transformiert den Standardstrahl (Ursprung 0/0/0, Richtung −Z) in diesen Strahl.
Wichtigster Einsatzzweck ist der Parameter offsetRay von XRSession.requestHitTestSource() und requestHitTestSourceForTransientInput(). Damit wird der Strahl relativ zu einem XRSpace (z. B. dem viewer-Raum) definiert und in jedem Frame neu ausgewertet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $origin | DOMPointInit | {x: 0, y: 0, z: 0, w: 1} | Startpunkt des Strahls. w muss 1 sein, sonst wird ein TypeError ausgelöst. |
| $direction | DOMPointInit | {x: 0, y: 0, z: -1, w: 0} | Richtungsvektor. Er wird automatisch normiert. w muss 0 sein, und x, y und z dürfen nicht alle 0 sein, sonst wird ein TypeError ausgelöst. |
| $transform | XRRigidTransform | Alternative Konstruktorform: Der Standardstrahl wird mit dieser starren Transformation (Position und Orientierung) verschoben und gedreht. |
Rückgabewert
XRRay-Objekt mit den Eigenschaften origin, direction und matrix.Beispiele
Strahl erzeugen und Eigenschaften auslesen
// Strahl 1,5 m über dem Boden, schräg nach vorne unten
const ray = new XRRay(
{ x: 0, y: 1.5, z: 0, w: 1 },
{ x: 0, y: -1, z: -1, w: 0 }
);
console.log(ray.origin.y);
console.log(ray.direction.y.toFixed(3), ray.direction.z.toFixed(3));
console.log(ray.matrix.length);
Hit-Test-Quelle mit offsetRay vom Blickpunkt aus
const startAR = async () => {
const session = await navigator.xr.requestSession('immersive-ar', {
requiredFeatures: ['hit-test', 'local']
});
const viewerSpace = await session.requestReferenceSpace('viewer');
const localSpace = await session.requestReferenceSpace('local');
// Strahl leicht nach unten geneigt, damit er eher den Boden trifft
const offsetRay = new XRRay({ x: 0, y: 0, z: 0 }, { x: 0, y: -0.3, z: -1 });
const hitTestSource = await session.requestHitTestSource({
space: viewerSpace,
offsetRay
});
const onFrame = (time, frame) => {
const results = frame.getHitTestResults(hitTestSource);
if (results.length > 0) {
const pose = results[0].getPose(localSpace);
console.log('Treffer bei', pose.transform.position);
}
session.requestAnimationFrame(onFrame);
};
session.requestAnimationFrame(onFrame);
};
document.querySelector('#ar-button').addEventListener('click', startAR);
Strahl aus einer XRRigidTransform erzeugen
// Um 90° um die Y-Achse gedreht, 1 m nach rechts versetzt
const angle = Math.PI / 2;
const transform = new XRRigidTransform(
{ x: 1, y: 0, z: 0 },
{ x: 0, y: Math.sin(angle / 2), z: 0, w: Math.cos(angle / 2) }
);
const ray = new XRRay(transform);
const { x, y, z } = ray.direction;
console.log(ray.origin.x, [x, y, z].map((v) => Math.round(v)));
Ungültige Richtung abfangen
try {
new XRRay({ x: 0, y: 0, z: 0 }, { x: 0, y: 0, z: 0 });
} catch (err) {
console.log(err.name);
}
// Wichtig · Fallstricke
- Kompatibilität: Experimentell und nur in Chromium-Browsern (Chrome, Edge, Chrome für Android, Samsung Internet) verfügbar. Firefox und Safari unterstützen das WebXR Hit Test Module nicht. Vorher mit
'XRRay' in windowprüfen. - Nur in sicheren Kontexten (HTTPS) verfügbar. Für Hit-Tests muss die Sitzung mit dem Feature
'hit-test'angefordert werden. directionwird automatisch normiert. Wer die Länge des übergebenen Vektors als Distanz verwenden will, verliert diese Information.- Ein
TypeErrorwird ausgelöst, wennorigin.w≠ 1,direction.w≠ 0 oder die Richtung ein Nullvektor ist. - Ein
XRRayist unveränderlich. Um den Strahl zu ändern, erzeugt man ein neues Objekt. Bei einer bestehenden Hit-Test-Quelle muss man dafür eine neue Quelle anfordern und die alte mitcancel()beenden. - Die Koordinaten beziehen sich immer auf den
XRSpace, zu dem der Strahl übergeben wird, und nicht auf Weltkoordinaten.