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. |
