C++ 将4x4矩阵分解为绝对变换

C++ 将4x4矩阵分解为绝对变换,c++,math,C++,Math,我最近对缩放矩阵的理解是,无论它包含什么平移,在这种情况下缩放都不会影响m[12],m[13],m[14] 鉴于: Matrix4: float m[16]; Row-Major: m[00], m[01], m[02], m[03] m[04], m[05], m[06], m[07] m[08], m[09], m[10], m[11] m[12], m[13], m[14], m[15] m[00], m[04], m[08] = Cross vector m[01], m[05],

我最近对缩放矩阵的理解是,无论它包含什么平移,在这种情况下缩放都不会影响m[12],m[13],m[14]

鉴于:

Matrix4:
float m[16];

Row-Major:
m[00], m[01], m[02], m[03]
m[04], m[05], m[06], m[07]
m[08], m[09], m[10], m[11]
m[12], m[13], m[14], m[15]

m[00], m[04], m[08] = Cross vector
m[01], m[05], m[09] = Up vector
m[02], m[06], m[10] = Normal vector
m[12], m[13], m[14] = Translation vector
使用C++/OpenGL。例如,在空间中的某一点缩放摄影机:

Vector3 target = Vector3r(1, 3, 0);

Matrix4 s(MATRIX4_IDENTITY);
s.SetScale(3,3,3); /// Arbitrary value.

Matrix4 t(MATRIX4_IDENTITY);
t.SetTranslation(target);

Matrix4 tMinus(MATRIX4_IDENTITY);
tMinus.SetTranslation(-target);

Camera *camera = GetCurrentCamera();
Matrix4 matrix = camera->GetMatrix();
matrix *= t * s * tMinus;
重要提示:这里的概念是,最终结果不是使用摄影机变换进行缩放。 也就是说,我们如何从矩阵中提取绝对平移和旋转,同时考虑到它已被缩放

camera->SetScale(1, 1, 1);
camera->SetTranslation(?); /// vector3
camera->SetRotation(?); /// quaternion

然后我们从这些变换中生成一个新的矩阵。

我会从矩阵中提取比例因子,将其反转,应用回矩阵,然后将该矩阵应用到相机?我会从矩阵中提取比例因子,将其反转,应用回矩阵,然后将该矩阵应用到相机?