2017-02-23 3 views
0

Мой метод тестирования выглядит следующим образом:Эйген :: Affine3d Rotation Неожиданный результат

TEST_METHOD(RotationTest1) 
    { 
     std::stringstream log; 
     Eigen::Affine3d t(
      Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ())* 
      Eigen::AngleAxisd(M_PI/8, Eigen::Vector3d::UnitY()) 
      ); 
     log << "Expected:\n" << t.rotation(); 

     Eigen::Affine3d act; 
     act = Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ())* 
      Eigen::AngleAxisd(M_PI/8, Eigen::Vector3d::UnitY()) * act; 
     //act.prerotate(Eigen::AngleAxisd(M_PI/8, Eigen::Vector3d::UnitY())); 
     //act.prerotate(Eigen::AngleAxisd(M_PI/4, Eigen::Vector3d::UnitZ())); 
     log << "\nActual:\n" << act.rotation(); 
     Logger::WriteMessage(log.str().c_str()); 
     Assert::IsTrue(t.rotation().isApprox(act.rotation())); 
    } 

Это произвело следующий противоречивый вывод:

Expected: 
0.653281 -0.707107 0.270598 
0.653281 0.707107 0.270598 
-0.382683   0 0.92388 
Actual: 
-0.756394 0.645492 -0.10587 
-0.324051 -0.510375 -0.79656 
-0.568206 -0.568206 0.595217 

Может кто-нибудь объяснить мне выше поведение, пожалуйста?

ответ

0

Я не устанавливал преобразование в личность, прежде чем пытаться преобразовать другие. Чтобы исправить это добавить строку после конструкции по умолчанию:

Eigen::Affine3d act; 
act.setIdentity(); 

Или построить с единичной матрицей:

Eigen::Affine3d act(Eigen::Affine3d::Identity()); 
+1

Или просто удалить экземпляр акта справа от цепи продукта. – ggael