mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-15 16:44:36 +00:00
inverse function
fixed inverse function, was not returning correctly.
This commit is contained in:
parent
fc058aaa5c
commit
8c19f6d8ca
2 changed files with 21 additions and 12 deletions
|
|
@ -678,7 +678,7 @@ public:
|
||||||
Matrix(const EulerF& e, const Point3F p);
|
Matrix(const EulerF& e, const Point3F p);
|
||||||
Matrix<DATA_TYPE, rows, cols>& set(const EulerF& e, const Point3F p);
|
Matrix<DATA_TYPE, rows, cols>& set(const EulerF& e, const Point3F p);
|
||||||
|
|
||||||
Matrix<DATA_TYPE, rows, cols> inverse();
|
Matrix<DATA_TYPE, rows, cols>& inverse();
|
||||||
Matrix<DATA_TYPE, rows, cols>& transpose();
|
Matrix<DATA_TYPE, rows, cols>& transpose();
|
||||||
void invert();
|
void invert();
|
||||||
|
|
||||||
|
|
@ -1374,7 +1374,7 @@ inline Matrix<DATA_TYPE, rows, cols>& Matrix<DATA_TYPE, rows, cols>::set(const E
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename DATA_TYPE, U32 rows, U32 cols>
|
template<typename DATA_TYPE, U32 rows, U32 cols>
|
||||||
inline Matrix<DATA_TYPE, rows, cols> Matrix<DATA_TYPE, rows, cols>::inverse()
|
inline Matrix<DATA_TYPE, rows, cols>& Matrix<DATA_TYPE, rows, cols>::inverse()
|
||||||
{
|
{
|
||||||
// TODO: insert return statement here
|
// TODO: insert return statement here
|
||||||
AssertFatal(rows == cols, "Can only perform inverse on square matrices.");
|
AssertFatal(rows == cols, "Can only perform inverse on square matrices.");
|
||||||
|
|
@ -1382,7 +1382,6 @@ inline Matrix<DATA_TYPE, rows, cols> Matrix<DATA_TYPE, rows, cols>::inverse()
|
||||||
|
|
||||||
// Create augmented matrix [this | I]
|
// Create augmented matrix [this | I]
|
||||||
Matrix<DATA_TYPE, size, 2 * size> augmentedMatrix;
|
Matrix<DATA_TYPE, size, 2 * size> augmentedMatrix;
|
||||||
Matrix<DATA_TYPE, size, size> resultMatrix;
|
|
||||||
|
|
||||||
for (U32 i = 0; i < size; i++)
|
for (U32 i = 0; i < size; i++)
|
||||||
{
|
{
|
||||||
|
|
@ -1418,7 +1417,8 @@ inline Matrix<DATA_TYPE, rows, cols> Matrix<DATA_TYPE, rows, cols>::inverse()
|
||||||
// Early out if pivot is 0, return identity matrix.
|
// Early out if pivot is 0, return identity matrix.
|
||||||
if (augmentedMatrix(i, i) == static_cast<DATA_TYPE>(0))
|
if (augmentedMatrix(i, i) == static_cast<DATA_TYPE>(0))
|
||||||
{
|
{
|
||||||
return Matrix<DATA_TYPE, rows, cols>(true);
|
this->identity();
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
DATA_TYPE pivotVal = augmentedMatrix(i, i);
|
DATA_TYPE pivotVal = augmentedMatrix(i, i);
|
||||||
|
|
@ -1447,11 +1447,11 @@ inline Matrix<DATA_TYPE, rows, cols> Matrix<DATA_TYPE, rows, cols>::inverse()
|
||||||
{
|
{
|
||||||
for (U32 j = 0; j < size; j++)
|
for (U32 j = 0; j < size; j++)
|
||||||
{
|
{
|
||||||
resultMatrix(i, j) = augmentedMatrix(i, j + size);
|
(*this)(i, j) = augmentedMatrix(i, j + size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return resultMatrix;
|
return (*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename DATA_TYPE, U32 rows, U32 cols>
|
template<typename DATA_TYPE, U32 rows, U32 cols>
|
||||||
|
|
|
||||||
|
|
@ -114,12 +114,6 @@ TEST(MatrixTest, TestMulFunction)
|
||||||
|
|
||||||
test.mul(test2);
|
test.mul(test2);
|
||||||
|
|
||||||
// mulL result
|
|
||||||
/*(null) = | 0.5403 -0.4546 0.7081 0.0000 |
|
|
||||||
| 0.8415 0.2919 -0.4546 0.0000 |
|
|
||||||
| 0.0000 0.8415 0.5403 0.0000 |
|
|
||||||
| 4.3845 -0.8479 3.1714 1.0000 |*/
|
|
||||||
|
|
||||||
EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
|
EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(0, 2), 0.0f, 0.001f); EXPECT_NEAR(test(0, 3), 5.0f, 0.001f);
|
||||||
EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 2.0f, 0.001f);
|
EXPECT_NEAR(test(1, 0), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 3), 2.0f, 0.001f);
|
||||||
EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
|
EXPECT_NEAR(test(2, 0), 0.7081f, 0.001f); EXPECT_NEAR(test(2, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), 1.0f, 0.001f);
|
||||||
|
|
@ -170,3 +164,18 @@ TEST(MatrixTest, TestMulArgMatrixFunction)
|
||||||
EXPECT_NEAR(testResult(3, 0), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 1), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 2), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 3), 1.0f, 0.001f);
|
EXPECT_NEAR(testResult(3, 0), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 1), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 2), 0.0f, 0.001f); EXPECT_NEAR(testResult(3, 3), 1.0f, 0.001f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(MatrixTest, TestInverse)
|
||||||
|
{
|
||||||
|
MatrixF test(true);
|
||||||
|
test.setPosition(Point3F(5.0f, 2.0f, 1.0f));
|
||||||
|
MatrixF test2(EulerF(1.0f, 0.0f, 1.0f));
|
||||||
|
|
||||||
|
test.mulL(test2);
|
||||||
|
|
||||||
|
test.inverse();
|
||||||
|
|
||||||
|
EXPECT_NEAR(test(0, 0), 0.5403f, 0.001f); EXPECT_NEAR(test(0, 1), -0.4546f, 0.001f); EXPECT_NEAR(test(0, 2), 0.7081f, 0.001f); EXPECT_NEAR(test(0, 3), -5.0f, 0.001f);
|
||||||
|
EXPECT_NEAR(test(1, 0), 0.8415f, 0.001f); EXPECT_NEAR(test(1, 1), 0.2919f, 0.001f); EXPECT_NEAR(test(1, 2), -0.4546f, 0.001f); EXPECT_NEAR(test(1, 3), -2.0f, 0.001f);
|
||||||
|
EXPECT_NEAR(test(2, 0), 0.0, 0.001f); EXPECT_NEAR(test(2, 1), 0.8415f, 0.001f); EXPECT_NEAR(test(2, 2), 0.5403f, 0.001f); EXPECT_NEAR(test(2, 3), -1.0f, 0.001f);
|
||||||
|
EXPECT_NEAR(test(3, 0), 0.0f, 0.001f); EXPECT_NEAR(test(3, 1), 0.0f, 0.001f); EXPECT_NEAR(test(3, 2), 0.0f, 0.001f); EXPECT_NEAR(test(3, 3), 1.0f, 0.001f);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue