在3D编程中,很多时候会遇到不同坐标系上一个点的坐标的转换的问题:即将一个坐标系上的点映射到另一坐标系上.
(1) 此处讨论求一个非标准坐标系上的点(相对值)在标准坐标系上的值(实际值).举个例子:假设以前的坐标系是标准的3D坐标系C1(opengl右手系):Z轴为(0,0,-1),X轴为(1,0,0),Y轴为(0,1,0).可以以Z轴为主,X轴取水平,即可求出Y轴(Y=X*Z,注意是叉乘,即外积).现在如果有另一个非标准的坐标系C2,其中心依然在原点不变,但Z轴向量Cz2为(a0,a1,a2),则其X轴向量Cx2 (假设为水平)可计算,Y轴向量Cy2也可计算出来,其中Cx2, Cy2 ,Cz2均为单位向量.如果要求C2坐标系上P(p0,,p1,p2)(如C2坐标系下的点为P(1,2,3),即P到C2的X轴距离为1,Y轴距离为2,Z轴距离为3)上的点在C1下的实际坐标,则直接将点P投影到C2的3个坐标轴上即可,所求点的坐标为: p0.Cx2+p1.Cy2+p2.Cz2 (注意,是点乘,即内积)
如下图中:标准坐标系为(X,Y,Z)黑色,新坐标系为(Cx2, Cy2 ,Cz2 )红色,所求点为P(p0,,p1,p2), P在C2坐标系中Cx2, Cy2平面上投影点为P’,P’在Cx2上的投影为M.向量OM长为|p0|,向量MP’长为|p1|,向量P’P长为|p2|,则0M= p0.Cx2, MP= p1.Cy2, P’P= p2.Cz2,故OP=OM+MP’+P’P= p0.Cx2+p1.Cy2+p2.Cz2,图中蓝色的线即为求OP的路径.
(2) 下面讨论(1)的逆过程, 即一个标准坐标系上的点(实际值)在非标准坐标系上的值(相对值).求解过程是一样的,即求OP在C2的三个坐标轴上的投影: p0.Cx2+p1.Cy2+p2.Cz2.可以验证,如果进行(1)(2),即将C2坐标系上的点投影到标准坐标系上,再将投影后的点还原为C2坐标系上,则点的坐标应该是不变的.可对点的X值验证:投影到标准坐标系上的点为P1,则P1= p0.Cx2+p1.Cy2+p2.Cz2,再将P1还原到C2上,即还原后的X值为: P1的X值*C2的X轴=( p0.Cx2+p1.Cy2+p2.Cz2)* Cx2=p0 (因为Cx2*Cx2=1, Cx2* Cy2= 0, Cx2* Cz2= 0).同理可证明Y,Z值.
(3) 对任二个坐标系(C3,C4)进行点的投影:可先将C3上的点P(p0,,p1,p2)投影到标准坐标系上的点P3,再将P3投影到P4上,即相当于先做(1) 的转换,再做(2)的转换,最后所求点为P3=(p3x,p3y,p3z)= (p0.Cx3+p1.Cy3+p2.Cz3),P4= p3x* Cx4+ p3y.Cy4+ p3z.Cz4.