Einrückungsstil
bearbeitet von Rolf bBevor Du weiter rumrotzt, lies Dir mal "Clean Code" von Robert Martin durch.
Die Maxime heißt "Do just one thing", und die Methode von Jo verletzt das trotz ihrer Kürze bereits ziemlich - was zu einem enormen Performance-Impact führt. Sie implementiert drei Dinge:
1. Generieren von Rotationsmatrizen um die X-, Y- und Z-Achse. Dafür sollte man 3 eigene Funktionen bereitstellen
2. Berechnen des Produkts von zwei Matrizen - eigene Funktion, bitte.
3. Berechnen des Produkts von einer Matrix mit einem Vektor. Sollte eine eigene Funktion sein, oder man fasst den Vektor als 3x1 Matrix auf und verwendet die Funktion aus Nr. 2.
D.h. man baut Helper wie build_rotX, build_rotY, build_rotZ, mat_multiply und linear_transform und benutzt sie so:
~~~php
$rxy = mat_multiply(build_rotX($beta), build_rotY($gamma));
$rxyz = mat_multiply($rxy, build_rotZ($delta));
$vRot = linear_transform($rxyz, $vec);
~~~
und spätestens jetzt merkt man, dass die Berechnung von $rxyz unabhängig ist von der linearen Transformation von $vec, d.h. wenn man nicht nur einen Vektor transformieren will, sondern hundert, kann man durch diese Aufteilung enorm Zeit sparen.
Ein Tipp noch: Matrizen können außer Rotation auch noch Skalieren und Scheren. Und wenn deine Transformationsmatrizen VIER-dimensional sind, können sie auch noch verschieben! Allerdings ist die Grafikkarte deutlich schneller damit, das zu berechnen, als PHP 😉
_Rolf_