2017-02-09 4 views
0

У меня есть камеры матрицы следующим образом:камера Внешнюю матрица в мире координаты

0.999995,-0.00313698,4.29446e-06, 0.632334 
0.00313675,0.999936,0.0108695,0.0111429 
-3.83917e-05,-0.0108695,0.999941,-21.8834 
0,0,0,1 

из матрицы вращения R:

0.999995,-0.00313698,4.29446e-06, 
0.00313675,0.999936,0.0108695, 
-3.83917e-05,-0.0108695,0.999941 

и Translation Matrix T:

0.632334, 0.0111429,-21.8834 

Что мне нужно сделать, так это скрыто от камеры до космоса. У меня есть формула, которая:

'Rotation from camera to world is simply 
inv(R) = transpose(R). 
T is the pre-rotated camera center, 
T = -R C, so C = -inv(R) T = (x,y,z).' 

Я новичок в матричном математике, и я запутался, как поступить. Как взять мою R-матрицу, а в C++ - сделать выше?

спасибо.

+0

Google "C++ 4x4 матрица". Существует множество бесплатных библиотек и примеров ... – Scheff

+0

Привет, спасибо за ваш ответ. Это формула, с которой я запутался. в: 'inv (R) = транспонировать (R). ', Google говорит мне, что обратная и транспонированная матрица различны. Как они могут быть равными? Должен ли я получить обратный? или транспонированной матрицы? – anti

+1

@CMouse Для общих матриц обратное и транспонированное - это нечто иное. (Например, инверсия возможна только на неособых матрицах, всегда применимо транспонирование). Матрицы, содержащие поворот, являются только исключением - в этом случае обратное _is_ транспонировать. Таким образом, инвертирование матрицы вращения становится очень дешевой операцией. См. Также: [Википедия] (https://en.wikipedia.org/wiki/Matrix_ (математика) #Orthogonal_matrix) – Scheff

ответ

0

Благодаря подталкивание в правильном направлении от @Scheff, у меня есть ответ:

void cameraMatrixToWorldSpace() 
{ 

    Eigen::Matrix3f R0; 
    Eigen::Vector3f T0; 
    Eigen::Vector3f C0; 

    T0 << 0.632334, 0.0111429, -21.8834; 

    R0 << 0.999995, -0.00313698, 4.29446e-06, 
     0.00313675, 0.999936, 0.0108695, 
     -3.83917e-05, -0.0108695, 0.999941; 


//inverse rotation matrix 
    R0.transposeInPlace(); 

    std::cout << "rotation 0: " << R0 << std::endl; 

    //to euler radians 
    Vector3f ea0 = R0.eulerAngles(0, 1, 2); 

    cout << "Euler 0 :" << endl; 
    cout << ea0 << endl << endl; 

    //world space translation 
    C0 = -R0 * T0; 

    std::cout << " Translation 0 : " << C0 << std::endl; 

}