| | 69 | TEST(MatrixDecomposition) |
|---|
| | 70 | { |
|---|
| | 71 | // construct test matrix m1 |
|---|
| | 72 | Matrix4f m1; |
|---|
| | 73 | Matrix4f m2; |
|---|
| | 74 | |
|---|
| | 75 | Vec3f vT1(1.0, -12.0, 15.0); |
|---|
| | 76 | Vec3f vS1(4.5, 3.2, 2.1); |
|---|
| | 77 | |
|---|
| | 78 | Quaternion qR1 (Vec3f( 6.6, 23.4, 75.4), 1.345); |
|---|
| | 79 | Quaternion qSO1(Vec3f(23.2, 8.7, 9.4), -2.6 ); |
|---|
| | 80 | |
|---|
| | 81 | m1.setTransform(vT1, qR1, vS1, qSO1); |
|---|
| | 82 | |
|---|
| | 83 | Vec3f vT2; |
|---|
| | 84 | Vec3f vS2; |
|---|
| | 85 | Quaternion qR2; |
|---|
| | 86 | Quaternion qSO2; |
|---|
| | 87 | |
|---|
| | 88 | Matrix4f mSO1; |
|---|
| | 89 | Matrix4f mSO1i; |
|---|
| | 90 | Matrix4f mS1; |
|---|
| | 91 | Matrix4f mSO1_S1_SO1i; |
|---|
| | 92 | |
|---|
| | 93 | Quaternion qSO1i(qSO1); |
|---|
| | 94 | |
|---|
| | 95 | qSO1i.invert(); |
|---|
| | 96 | |
|---|
| | 97 | mSO1 .setRotate(qSO1 ); |
|---|
| | 98 | mSO1i.setRotate(qSO1i); |
|---|
| | 99 | mS1.setScale(vS1); |
|---|
| | 100 | |
|---|
| | 101 | mSO1_S1_SO1i = mSO1; |
|---|
| | 102 | mSO1_S1_SO1i.mult(mS1); |
|---|
| | 103 | mSO1_S1_SO1i.mult(mSO1i); |
|---|
| | 104 | |
|---|
| | 105 | std::cerr << "mSO1_S1_SO1i =\n" << mSO1_S1_SO1i << std::endl; |
|---|
| | 106 | |
|---|
| | 107 | // decompose m1 and build m2 from components |
|---|
| | 108 | m1.getTransform(vT2, qR2, vS2, qSO2); |
|---|
| | 109 | |
|---|
| | 110 | std::cerr << "vT1 = " << vT1 << "\n" |
|---|
| | 111 | << "vS1 = " << vS1 << "\n" |
|---|
| | 112 | << "qR1 = " << qR1 << "\n" |
|---|
| | 113 | << "qSO1 = " << qSO1 << std::endl; |
|---|
| | 114 | |
|---|
| | 115 | std::cerr << "m1 =\n" << m1 << std::endl; |
|---|
| | 116 | std::cerr << "vT2 = " << vT2 << "\n" |
|---|
| | 117 | << "vS2 = " << vS2 << "\n" |
|---|
| | 118 | << "qR2 = " << qR2 << "\n" |
|---|
| | 119 | << "qSO2 = " << qSO2 << std::endl; |
|---|
| | 120 | |
|---|
| | 121 | m2.setTransform(vT2, qR2, vS2, qSO2); |
|---|
| | 122 | |
|---|
| | 123 | std::cerr << "m2 =\n" << m2 << std::endl; |
|---|
| | 124 | |
|---|
| | 125 | |
|---|
| | 126 | Matrix4f mSO2; |
|---|
| | 127 | Matrix4f mSO2i; |
|---|
| | 128 | Matrix4f mS2; |
|---|
| | 129 | Matrix4f mSO2_S2_SO2i; |
|---|
| | 130 | |
|---|
| | 131 | Quaternion qSO2i(qSO2); |
|---|
| | 132 | |
|---|
| | 133 | qSO2i.invert(); |
|---|
| | 134 | |
|---|
| | 135 | mSO2 .setRotate(qSO2 ); |
|---|
| | 136 | mSO2i.setRotate(qSO2i); |
|---|
| | 137 | mS2.setScale(vS2); |
|---|
| | 138 | |
|---|
| | 139 | mSO2_S2_SO2i = mSO2; |
|---|
| | 140 | mSO2_S2_SO2i.mult(mS2); |
|---|
| | 141 | mSO2_S2_SO2i.mult(mSO2i); |
|---|
| | 142 | |
|---|
| | 143 | std::cerr << "mSO2_S2_SO2i =\n" << mSO2_S2_SO2i << std::endl; |
|---|
| | 144 | |
|---|
| | 145 | |
|---|
| | 146 | // test ||m1 - m2|| <= 1.0e-6 |
|---|
| | 147 | m1.addScaled(m2, -1.0); |
|---|
| | 148 | |
|---|
| | 149 | CHECK_CLOSE(0.0, m1.normInfinity(), 1.0e-6); |
|---|
| | 150 | } |
|---|