diff options
author | Marc Sunet <jeannekamikaze@gmail.com> | 2012-09-02 21:03:52 +0200 |
---|---|---|
committer | Marc Sunet <jeannekamikaze@gmail.com> | 2012-09-02 21:03:52 +0200 |
commit | c41c0badf5d4f586d7d49790471f4c5d9ac2b382 (patch) | |
tree | 4a79da80150540d64df4717c037b9f28ea2795d8 | |
parent | ad4d6c690cdbc3c034fcac83e2c6b569ff615bda (diff) |
Added inverse
-rw-r--r-- | Spear/Math/Matrix4.hs | 150 |
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. | ||
451 | inverse :: Matrix4 -> Matrix4 | ||
452 | inverse 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. |