不同坐标系的矩阵变换
不同坐标系的矩阵变换
概要:三维坐标系的变换,实质上则是原点以及正交基向量的变化,在空间中表现为平移和旋转。
如图所示的坐标系变换,可以用一个变换矩阵来表示。
接下来,就当复习一下,我来推导出这个变换矩阵是如何得到的,用到是一些比较基本的线性代数的知识。
首先,我们要理解为什么需要这个矩阵,我们在什么情况下需要这个矩阵。很明显,在已知新坐标系的基向量的情况下,如果我们需要将原坐标系的坐标转化为新坐标系下的坐标,就可以使用这个矩阵。
已知:点P在原坐标系的坐标为(x,y,z),x轴方向的单位向量为,y轴方向的单位向量为
,z轴方向的单位向量为
,
新坐标系的原点在原坐标系的坐标为(x0,y0,z0),
x轴方向的单位向量为 :
y轴方向的单位向量为:
z轴方向的单位向量为:
求:点P在新坐标系下的坐标(x’,y’,z’)。
理解:所谓点的坐标其实就是向量的线性组合,而坐标系之间基向量的转变也是向量的线性组合,这时候很明显要想到矩阵了!
为了得到这个矩阵,我们需要构造一个线性方程组。如下:
根据这个方程组我们可以比较容易地得到:
接下来是最后一步,我要求出这个方阵的逆矩阵,这里只需要先左乘一个矩阵使得方阵变为这个形式的矩阵。
然后,再对A、B分别求逆矩阵即可,而A矩阵是正交矩阵,正交矩阵的逆矩阵等于转置矩阵,这里只需要简单地转置即可,而B矩阵为[1],逆矩阵为[1]。
最后得到,
右边的方阵就是我们所需要的变换矩阵!
总结:坐标系的转化,其实就是将衡量标准通过另一组正交基向量来展示,而正交基向量的转化就是对原正交基向量的线性组合。
code:
double u0 = R_inv.element[0][0];
double u1 = R_inv.element[0][1];
double u2 = R_inv.element[0][2];
double v0 = R_inv.element[1][0];
double v1 = R_inv.element[1][1];
double v2 = R_inv.element[1][2];
double n0 = R_inv.element[2][0];
double n1 = R_inv.element[2][1];
double n2 = R_inv.element[2][2];
double t2[3];
t2[0] = -1 * ((t[0] * u0) + (t[1] * u1) + (t[2] * u2));
t2[1] = -1 * ((t[0] * v0) + (t[1] * v1) + (t[2] * v2));
t2[2] = -1 * ((t[0] * n0) + (t[1] * n1) + (t[2] * n2));