Start · Sprachen · JavaScript · Referenz · DOMMatrixReadOnly.rotateAxisAngle()

DOMMatrixReadOnly.rotateAxisAngle()

Methode

Gibt eine neue <code>DOMMatrix</code> zurück, die aus der Ausgangsmatrix durch eine Drehung um den Winkel <code>angle</code> (in Grad) um die Achse <code>(rotX, rotY, rotZ)</code> entsteht.

seit JavaScript Baseline: alle modernen Browser (Geometry Interfac Kategorie: webapi

Signatur

DOMMatrixReadOnly.prototype.rotateAxisAngle(rotX, rotY, rotZ, angle)

Beschreibung

rotateAxisAngle() multipliziert die aktuelle Matrix von rechts mit einer 3D-Drehmatrix. Die Drehung erfolgt um eine beliebige Achse, die durch den Vektor (rotX, rotY, rotZ) beschrieben wird, um den Winkel angle in Grad. Das Ergebnis entspricht der CSS-Funktion rotate3d(x, y, z, angle).

Die Methode ist nicht verändernd: Die Ausgangsmatrix bleibt unverändert, zurückgegeben wird immer eine neue DOMMatrix. Willst du die Matrix direkt verändern, nimm die veränderbare Variante DOMMatrix.prototype.rotateAxisAngleSelf().

Der Achsenvektor wird intern normiert, seine Länge spielt also keine Rolle, nur seine Richtung. Sobald rotX oder rotY ungleich 0 ist, wird die Ergebnismatrix zu einer 3D-Matrix (is2D === false). Eine Drehung nur um die Z-Achse (0, 0, 1) bleibt 2D und entspricht rotate(angle).

Typische Anwendungen sind 3D-Effekte in CSS (Karten umdrehen, Würfel drehen), eigene Transformationsberechnungen für Canvas bzw. WebGL-nahe Logik und das Transformieren einzelner Punkte mit DOMPoint.matrixTransform().

Parameter

Name Typ Default Beschreibung
$rotX number 0 X-Komponente des Achsenvektors.
$rotY number 0 Y-Komponente des Achsenvektors.
$rotZ number 0 Z-Komponente des Achsenvektors.
$angle number 0 Drehwinkel in Grad (nicht im Bogenmaß). Positive Werte drehen im Uhrzeigersinn, wenn man entgegen der Achsrichtung blickt (Koordinatensystem mit Y-Achse nach unten, wie in CSS).

Rückgabewert

Typ
DOMMatrix
Beschreibung
Eine neue DOMMatrix, die aus der Ausgangsmatrix und der angehängten Drehung besteht. Die Ausgangsmatrix bleibt unverändert.

Beispiele

Drehung um die Z-Achse entspricht rotate()

const base = new DOMMatrixReadOnly();
const rotated = base.rotateAxisAngle(0, 0, 1, 90);

console.log(rotated.is2D);
console.log(rotated.toString());
console.log(base.isIdentity); // Ausgangsmatrix bleibt unverändert
true matrix(6.123233995736766e-17, 1, -1, 6.123233995736766e-17, 0, 0) true

Punkt um die Y-Achse drehen

const m = new DOMMatrixReadOnly().rotateAxisAngle(0, 1, 0, 90);
const p = new DOMPoint(1, 0, 0).matrixTransform(m);

// Rundungsfehler bei Gleitkommazahlen glätten
const round = (n) => Math.round(n * 1e6) / 1e6 + 0;
console.log(round(p.x), round(p.y), round(p.z));
console.log(m.is2D);
0 0 -1 false

3D-Drehung einer Karte per CSS-Transform

const card = document.querySelector('.card');
const start = new DOMMatrixReadOnly('perspective(800px)');

let angle = 0;
const tick = () => {
  angle = (angle + 2) % 360;
  // Diagonale Achse – wird intern normiert
  const m = start.rotateAxisAngle(1, 1, 0, angle);
  card.style.transform = m.toString(); // ergibt matrix3d(...)
  requestAnimationFrame(tick);
};
requestAnimationFrame(tick);

// Wichtig · Fallstricke

  • Grad statt Bogenmaß: Anders als Math.sin()/Math.cos() erwartet angle Grad. Wer Math.PI / 2 übergibt, dreht nur um etwa 1,57°.
  • Gleitkomma-Ungenauigkeit: Werte wie cos(90°) ergeben 6.123233995736766e-17 statt 0. Vergleiche daher mit einer Toleranz und nicht mit ===.
  • Nullvektor: Sind alle drei Achsenkomponenten 0 (das ist der Standard, wenn man sie weglässt), lässt sich keine Achse bestimmen und es findet keine sinnvolle Drehung statt. Gib die Achse daher immer ausdrücklich an.
  • 2D wird zu 3D: Ist rotX oder rotY ungleich 0, wird is2D auf false gesetzt. toString() liefert dann matrix3d(...), und das Ergebnis lässt sich nicht mehr verlustfrei als 2D-Canvas-Transformation (setTransform) verwenden.
  • Reihenfolge: Die Drehung wird von rechts multipliziert, wirkt also im lokalen Koordinatensystem nach den bereits vorhandenen Transformationen. Die Reihenfolge verketteter Aufrufe ist entscheidend.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt, auch in Web Workern. In Node.js gibt es DOMMatrix nicht von Haus aus, dort braucht man Polyfills (z. B. aus canvas- oder jsdom-Umgebungen).