三维中的坐标系如何转换
KarlvonDonitz
2018年02月07日 14:44

0x00 前言

     大家吼啊,我们又见面了!这次我们要说说三维中的坐标系如何转换。但是那,在这之前我们需要先知道二维中的怎么转换。这样便更容易清楚三维中的坐标系如何转换啦。注意!文章中的转换都使用齐次坐标。如果不明白什么是齐次坐标,请看看上一篇科普专栏。如果不懂矩阵,可以先阅读高中数学。

0x01 二维坐标系的变换

     

对于点P‘我们有2个坐标系来表示他的位置

      这里有个点P’我们不难看出来,它的位置可以用(x',y')和(x,y)来表达。当然,我们也可以根据上一章说到的方式可以得到

      | x‘ |    | x |   |    1    0    Δx |

      | y’ | = | y |   |    0    1   Δy |

      | 1 |    | 1 |   |    0    0    1  |

    这个我觉得不需要过多的解释了,非常容易理解。那么,二维中的旋转我们应该如何理解呢?

对于某点(x,y)的作图

         我们假设点(x,y)的原坐标系X,Y绕原点旋转了Θ度,对此我们可以得到一个变换矩阵:

                        | cosΘ sinΘ     0 |

       R(Θ)= | cosΘ -sinΘ    0 |

                        |   0        0         1 |

           也就是原坐标和旋转后坐标的关系是:

       | x’ |      | x |    | cosΘ sinΘ     0 |  

       | y‘ |  =  | y |    | cosΘ -sinΘ    0 | 

       | 1 |      | 1 |    |   0        0         1 |

      嗯,至少到此为止,我们的进展都很顺利。但是很不幸的,在三维里面,你能拿到的往往都不是你现在能获得到的旋转角度Θ。换句话说,在三维里面,你可能需要2个旋转角Θ才能完成坐标系的旋转。这样岂不是太麻烦了?

0x02 在二维旋转中找找其他的方式

     我们来试试看物理的方式?我们将两个坐标系看成两个力,将他们进行分解试试看:

生成的3个矢量(x+y),y和x

       我们先将(x+y)这个力也分解成x’,y’这2个力,这时候我们来看看原来的变换矩阵:

       | x’ |      | x |    | cosΘ sinΘ     0 |  

       | y‘ |  =  | y |    | cosΘ -sinΘ    0 | 

       | 1 |      | 1 |    |   0        0         1 |

      如果你是一个数学和物理都不错的人,那么你应该会发现,第一列(cosΘ,sinΘ,0)和第二列(cosΘ,-sinΘ,0)这两个都正好是新坐标x’,y’在原坐标中的方向矢量,而且是正交的单位矢量。

        正交的单位矢量也意味着什么呢?这也表明了,这正好是变换中,新坐标的单位矢量。我们这时候就可以使用这样的单位矢量来进行变换了。将这个理念代入三维中试试看?

0x03 三维的坐标系变换

2个坐标系,其中(X,Y,Z)为新坐标原点

         这时候我们便可以将(x,y,z)这个坐标系的三个方向矢量分别规格化,对此我们就可以得到用原坐标系定义的3个正交单位矢量。

           u=(ux,uy,uz)

           v=(vx,vy,vz)

           w=(wx,wy,wz)

      对此我们可以将新坐标原点位置(x,y,z)加以利用,便可以得到变换矩阵:

    T3(表示平移)X R3(表示旋转)

    |1    0    0    0   |  |ux    vx    wx      0 |

=  |0    1     0    0  |  |uy    vy    wy     0 |

    |0     0     1    0 |  |uz    vz    wz     0 |

    |-x    -y    -z    1 |  |0     0      0      1 |

        搞定,这样就能够十分简单的进行三维中坐标系之间的变换了!