Jelajahi Sumber

allow for improper rotations

- in Mat4.isRotationAndTranslation
Alexander Rose 5 tahun lalu
induk
melakukan
e5d6816392
1 mengubah file dengan 6 tambahan dan 2 penghapusan
  1. 6 2
      src/mol-math/linear-algebra/3d/mat4.ts

+ 6 - 2
src/mol-math/linear-algebra/3d/mat4.ts

@@ -743,6 +743,8 @@ namespace Mat4 {
      * Check if the matrix has the form
      * [ Rotation    Translation ]
      * [ 0           1           ]
+     *
+     * Allows for improper rotations
      */
     export function isRotationAndTranslation(a: Mat4, eps?: number) {
         return _isRotationAndTranslation(a, typeof eps !== 'undefined' ? eps : EPSILON)
@@ -752,12 +754,14 @@ namespace Mat4 {
         const a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],
             a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],
             a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],
-            /* a30 = a[12], a31 = a[13], a32 = a[14],*/ a33 = a[15];
+            a33 = a[15];
 
         if (!equalEps(a33, 1, eps) || !equalEps(a03, 0, eps) || !equalEps(a13, 0, eps) || !equalEps(a23, 0, eps)) {
             return false;
         }
-        const det3x3 = a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20);
+
+        // use `abs` to allow for improper rotations
+        const det3x3 = Math.abs(a00 * (a11 * a22 - a12 * a21) - a01 * (a10 * a22 - a12 * a20) + a02 * (a10 * a21 - a11 * a20));
         if (!equalEps(det3x3, 1, eps)) {
             return false;
         }