Show
Ignore:
Timestamp:
01/21/08 16:07:56 (1 year ago)
Author:
cneumann
Message:

fixed: getTransform decomposes matrix into correct transformation

parts


The implementation of this functionality is from
Graphics Gems IV, article III.4 "Polar Matrix Decomposition".

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Source/Base/Base/OSGMatrixTest.cpp

    r666 r1040  
    4040 
    4141#include <OpenSG/OSGMatrix.h> 
     42#include <OpenSG/OSGQuaternion.h> 
     43 
     44#include <iostream> 
    4245 
    4346OSG_USING_NAMESPACE 
     
    6467} 
    6568 
     69TEST(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} 
    66151 
    67152} // SUITE