1. 程式人生 > >世界座標變換要先縮放、後旋轉、再平移的原因

世界座標變換要先縮放、後旋轉、再平移的原因

一個三維場景中的各個模型一般需要各自建模,再通過座標變換放到一個統一的世界空間的指定位置上。 這個過程在 3D 圖形學中稱作“世界變換” 。 世界變換有三種,平移、旋轉和縮放 (實際還有不常用的扭曲和映象,它們不是affine變換)。 這三種變換按各種順序執行,結果是不同的。 可是實際的應用中一般按照 縮放 -> 旋轉 -> 平移的順序進行。  這樣做的原因是可以獲得最符合常理的變換結果。 

比方說,通過世界變換希望獲得的結果可能是:

將一個放在原點的物體(比方說可樂罐)移動到(30,50),讓它自身傾斜 45 度,再放大 2 倍。 
 

而不希望的結果是:

  1. 和本地座標軸成角度的縮放(會導致扭曲,像踩扁的可樂罐)。
  2. 繞自己幾何中心以外位置的原點的旋轉 (地球公轉式) 和縮放。


而顛倒了上述變換順序就會得到這樣不自然的結果。
具體的說:

  • 當縮放在旋轉之後進行時,會發生現象1。
  • 當縮放和旋轉在平移之後進行時會發生現象2。


這時因為:

  • 在物體剛剛放入世界座標系的時候使用的是本地座標,也就是本地和全域性座標系的原點和座標軸都是重合的(當然兩者分別使用了左右手座標系時除外 - 那是BUG),此時所有物體都“把世界座標系當做自己的本地座標系”。
  • 而經過了座標變換之後:
  1. 縮放變換不改變座標軸的走向,也不改變原點的位置,所以兩個座標系仍然重合。
  2. 旋轉變換改變座標軸的走向,但不改變原點的位置,所以兩個座標系座標軸不再處於相同走向。
  3. 平移變換不改變座標軸走向,但改變原點位置,兩個座標系原點不再重合。

這樣就可以解釋問什麼縮放不能在旋轉之後,而縮放和旋轉都不能在平移之後了。 於是沒有問題的順序只能是 縮放 -> 旋轉 -> 平移 。