aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarc Sunet <jeannekamikaze@gmail.com>2012-09-02 21:03:52 +0200
committerMarc Sunet <jeannekamikaze@gmail.com>2012-09-02 21:03:52 +0200
commitc41c0badf5d4f586d7d49790471f4c5d9ac2b382 (patch)
tree4a79da80150540d64df4717c037b9f28ea2795d8
parentad4d6c690cdbc3c034fcac83e2c6b569ff615bda (diff)
Added inverse
-rw-r--r--Spear/Math/Matrix4.hs150
1 files changed, 148 insertions, 2 deletions
diff --git a/Spear/Math/Matrix4.hs b/Spear/Math/Matrix4.hs
index 5c54aea..ac2761f 100644
--- a/Spear/Math/Matrix4.hs
+++ b/Spear/Math/Matrix4.hs
@@ -40,7 +40,8 @@ module Spear.Math.Matrix4
40, Spear.Math.Matrix4.zipWith 40, Spear.Math.Matrix4.zipWith
41, Spear.Math.Matrix4.map 41, Spear.Math.Matrix4.map
42, transpose 42, transpose
43, inverseTransform 43, inverseTransform
44, inverse
44, mul 45, mul
45, mulp 46, mulp
46, muld 47, muld
@@ -443,7 +444,152 @@ inverseTransform mat =
443 (V3.x r) (V3.y r) (V3.z r) (-t `V3.dot` r) 444 (V3.x r) (V3.y r) (V3.z r) (-t `V3.dot` r)
444 (V3.x u) (V3.y u) (V3.z u) (-t `V3.dot` u) 445 (V3.x u) (V3.y u) (V3.z u) (-t `V3.dot` u)
445 (V3.x f) (V3.y f) (V3.z f) (-t `V3.dot` f) 446 (V3.x f) (V3.y f) (V3.z f) (-t `V3.dot` f)
446 0 0 0 1 447 0 0 0 1
448
449
450-- | Invert the given matrix.
451inverse :: Matrix4 -> Matrix4
452inverse mat =
453 let
454 a00 = m00 mat
455 a01 = m01 mat
456 a02 = m02 mat
457 a03 = m03 mat
458 a04 = m10 mat
459 a05 = m11 mat
460 a06 = m12 mat
461 a07 = m13 mat
462 a08 = m20 mat
463 a09 = m21 mat
464 a10 = m22 mat
465 a11 = m23 mat
466 a12 = m30 mat
467 a13 = m31 mat
468 a14 = m32 mat
469 a15 = m33 mat
470
471 m00' = a05 * a10 * a15
472 - a05 * a11 * a14
473 - a09 * a06 * a15
474 + a09 * a07 * a14
475 + a13 * a06 * a11
476 - a13 * a07 * a10
477
478 m04' = -a04 * a10 * a15
479 + a04 * a11 * a14
480 + a08 * a06 * a15
481 - a08 * a07 * a14
482 - a12 * a06 * a11
483 + a12 * a07 * a10
484
485 m08' = a04 * a09 * a15
486 - a04 * a11 * a13
487 - a08 * a05 * a15
488 + a08 * a07 * a13
489 + a12 * a05 * a11
490 - a12 * a07 * a09
491
492 m12' = -a04 * a09 * a14
493 + a04 * a10 * a13
494 + a08 * a05 * a14
495 - a08 * a06 * a13
496 - a12 * a05 * a10
497 + a12 * a06 * a09
498
499 m01' = -a01 * a10 * a15
500 + a01 * a11 * a14
501 + a09 * a02 * a15
502 - a09 * a03 * a14
503 - a13 * a02 * a11
504 + a13 * a03 * a10
505
506 m05' = a00 * a10 * a15
507 - a00 * a11 * a14
508 - a08 * a02 * a15
509 + a08 * a03 * a14
510 + a12 * a02 * a11
511 - a12 * a03 * a10
512
513 m09' = -a00 * a09 * a15
514 + a00 * a11 * a13
515 + a08 * a01 * a15
516 - a08 * a03 * a13
517 - a12 * a01 * a11
518 + a12 * a03 * a09
519
520 m13' = a00 * a09 * a14
521 - a00 * a10 * a13
522 - a08 * a01 * a14
523 + a08 * a02 * a13
524 + a12 * a01 * a10
525 - a12 * a02 * a09
526
527 m02' = a01 * a06 * a15
528 - a01 * a07 * a14
529 - a05 * a02 * a15
530 + a05 * a03 * a14
531 + a13 * a02 * a07
532 - a13 * a03 * a06
533
534 m06' = -a00 * a06 * a15
535 + a00 * a07 * a14
536 + a04 * a02 * a15
537 - a04 * a03 * a14
538 - a12 * a02 * a07
539 + a12 * a03 * a06
540
541 m10' = a00 * a05 * a15
542 - a00 * a07 * a13
543 - a04 * a01 * a15
544 + a04 * a03 * a13
545 + a12 * a01 * a07
546 - a12 * a03 * a05
547
548 m14' = -a00 * a05 * a14
549 + a00 * a06 * a13
550 + a04 * a01 * a14
551 - a04 * a02 * a13
552 - a12 * a01 * a06
553 + a12 * a02 * a05
554
555 m03' = -a01 * a06 * a11
556 + a01 * a07 * a10
557 + a05 * a02 * a11
558 - a05 * a03 * a10
559 - a09 * a02 * a07
560 + a09 * a03 * a06
561
562 m07' = a00 * a06 * a11
563 - a00 * a07 * a10
564 - a04 * a02 * a11
565 + a04 * a03 * a10
566 + a08 * a02 * a07
567 - a08 * a03 * a06
568
569 m11' = -a00 * a05 * a11
570 + a00 * a07 * a09
571 + a04 * a01 * a11
572 - a04 * a03 * a09
573 - a08 * a01 * a07
574 + a08 * a03 * a05
575
576 m15' = a00 * a05 * a10
577 - a00 * a06 * a09
578 - a04 * a01 * a10
579 + a04 * a02 * a09
580 + a08 * a01 * a06
581 - a08 * a02 * a05
582
583 det' = a00 * m00' + a01 * m04' + a02 * m08' + a03 * m12'
584 in
585 if det' == 0 then Spear.Math.Matrix4.id
586 else
587 let det = 1 / det'
588 in mat4
589 (m00' * det) (m04' * det) (m08' * det) (m12' * det)
590 (m01' * det) (m05' * det) (m09' * det) (m13' * det)
591 (m02' * det) (m06' * det) (m10' * det) (m14' * det)
592 (m03' * det) (m07' * det) (m11' * det) (m15' * det)
447 593
448 594
449-- | Transform the given vector in 3D space with the given matrix. 595-- | Transform the given vector in 3D space with the given matrix.