矩陣與坐標系


   在OSG里用4*4矩陣表示坐標系,空間坐標系有三個軸X,Y,Z,那么表示坐標系的矩陣中各個數字的具體意義,以及怎樣建立局部坐標系就是本文所要說明的。

矩陣意義

  矩陣的前三列表示局部坐標系的各個軸的方向,最后一行表示世界坐標系下原點在局部坐標系下的坐標。

 

              X軸  Y軸  Z軸

              a00     a01     a02     a03

              a10     a11     a12     a13

              a20     a21     a22     a23

    世界原點所在位置       a30     a31     a32     a33

 

  矩陣的最后一列一般是0 0 0 1,也就是說最終的矩陣只需要確定前三列的值就可以了:

              X軸  Y軸  Z軸

              a00     a01     a02     0

              a10     a11     a12     0

              a20     a21     a22     0

    世界原點所在位置       a30     a31     a32     1

 

構建矩陣

 

  如上圖所示,x,y,z是世界坐標系,A(1,0,0)、B(0,1,0)、C(0,0,1)三點確定了一個平面,OO’是平面的法線。

  現在按以下要求建立坐標系:

      以O’為局部坐標系原點

      O’Z’為Z軸

      X軸可以選擇平面上任意一條過O’的直線,如O’C

      Y軸就是z’^x‘      (^表示向量叉乘)

 

  按照以上要求,可通過以下步驟來構建表示此局部坐標系的矩陣。

1、確定軸方向

  由ABC三點可求得O’的坐標為(1/3,1/3,1/3)。進一步求得三個軸的方向向量為:

    x’(-1/3,-1/3,2/3)

    y’(1/3,-1/3,0)

    z’(1/3,1/3,1/3)

 

  因此建立局部坐標系如下:

    x軸       y軸        z軸

    -1/3     1/3       1/3      0

    -1/3     -1/3      1/3     0

    2/3       0          1/3     0

    0          0          0        1          原點所在位置

 

2、確定原點坐標

  還需要確定世界坐標系原點在此坐標系下的坐標,由圖上可知,原點在z’軸的負方向,OO’的長度為√3/3,所以原點在局部坐標系的坐標為(0,0,- √3/3)

  局部坐標系如下:

    x軸       y軸        z軸

    -1/3      1/3        1/3        0

    -1/3     -1/3        1/3       0

    2/3       0           1/3        0

    0          0          -√3/3  1          原點所在位置

 

3、單位化

  必須保證坐標系各個軸是單位向量,因此需要對每個軸單位化,最終的矩陣M如下:

    x軸          y軸          z軸

       -√6/6  √2/2   √3/3        0

       -√6/6  -√2/2  √3/3       0

       √6/3         0          √3/3       0

       0              0          -√3/3      1          原點所在位置

 

4、補充說明

  必須要注意一點,M是一個WorldToLocal的矩陣,也就是說它是將世界坐標換算到局部坐標的矩陣。

  三維坐標在與矩陣相乘的時候,需要補充一個值,構成四維才能運算,補充的值就是1。可以驗證一下:

  C點在世界坐標系下是(0,0,1),在局部坐標系下就是(|O’C|,0,0),其中C的長度是√6/3。

               (0,0,1,1) * M = (√6/3,0,0)。

 

直接計算LocalToWorld矩陣

  如果已經明確局部坐標系的X、Y、Z軸方向和原點位置,那么可以直接計算出局部坐標系。

  此矩陣前三行表示局部坐標系的各個軸的方向,第四行表示的是局部坐標系的原點在世界坐標系中的位置。

 

      X軸        a00     a01     a02     0

      Y軸        a10     a11     a12     0

      Z軸        a20     a21     a22     0

    局部原點所在位置     a30     a31     a32     1

 

  繼續用以上的例子來說明,X、Y、Z現已經明確,O’就是局部坐標系的原點,因此第四行就是O’坐標:

 

                    X軸                    -√6/6       -√6/6      √6/3      0

                    Y軸                     √2/2        √2/2         0         0

                    Z軸                     √3/3        √3/3       √3/3      0

           局部原點所在位置        1/3          1/3         1/3       1

 

  可以驗證一下,C點坐標在局部坐標系下是(√6/3,0,0),補1構成四維,乘以這個矩陣:

                                                        (√6/3,0,0,1) * M = (0,0,1,1)

  C點的世界坐標正是(0,0,1)。

 

  直接計算LocalToWorld矩陣要比計算WorldToLocal矩陣更簡便一些,省去了確定原點的步驟,因此可用這種方法來快速建立局部坐標系。

 

  特別需要說明的是,以上所說的矩陣都是在OSG的表示方式,OpenGL中的矩陣與OSG中的矩陣是轉置關系。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM