2010-09-09 55 views
2

縮放矩陣,但它沒有太大的關係了這個例子。所以我們說我有一個精靈。然後我在任何事情之前應用一個縮放矩陣縮放矩陣是應用縮放精靈的局部座標軸還是僅移動點?換句話說,是在世界空間中將世界空間中的0.5f的縮放矩陣應用於我的世界原點上的精靈,縮放精靈的局部軸還是將精靈組成的所有點縮小一半?怎麼看我使用XNA從幾何角度

同一種適用於平移和縮放,然後。在我的腦海中,我畫了一個30,30的平移矩陣,將精靈的本地原點移動到30,30,結果精靈的本地軸移動到30,30。然後,按0.5f縮放會縮小局部座標軸,但我不明白爲什麼精靈的原點現在是15,15。

這種混淆複合了這樣一個事實,即您在世界的x軸上向右執行1的翻譯,您現在正在根據您應用的比例移動(所以您只需移動.5世界)。這讓我相信這個尺度被應用到物體自己的軸上。

順便說一句,如果你們談談你的followups起源,你能說明你指的是哪種起源?

謝謝

回答

1

正常情況下,一個精靈是由它的頂點(點)定義的。將縮放矩陣應用於精靈將轉換精靈的頂點(點)。

A標度矩陣總是假定(0,0)是標度的轉換的原點。所以如果你縮放一個以(30,30)爲中心的精靈,所有的點都會從(0,0)點開始伸展。如果有幫助,可以將精靈想象成圍繞(0,0)點的圓上的小圓點,並縮放整個圓。

如果您想要從精靈中心縮放(30,30)的精靈,必須首先將精靈的中心轉換爲(0,0),然後將精靈重新轉換爲(30 ,30)。

因此,這將是:

Translate(-30, -30) 
    Scale(0.5) 
    Translate(30, 30) 
+0

我覺得我現在可以得到它,如果我以某種方式思考它。在開始時,我的本地和世界座標軸是相同的,因此x方向上的平移1是1的平移,因爲世界和本地空間的尺寸都是相同的。應用0.5f的比例將本質上縮小我的局部空間的像素寬度,因此點縮減,世界座標結果是一個減半的座標。現在,如果我翻譯這個精靈,會發生沿着本地空間的縮小軸發生的平移,並且我們可以識別世界座標。 – Ilya 2010-09-09 16:40:07

+1

最後一句聽起來不對。在你的問題中,你談論翻譯和縮放精靈。在這裏你正在談論縮放然後翻譯。這是兩個非常不同的操作。如果你縮放(0.5),然後平移(30,30),最終你會得到一個尺寸是點(30,30)一半的精靈。如果你翻譯(30,30)然後縮放(0.5),你最終會得到一個大小爲點(15,15)一半的精靈。重點是標尺總是從點(0,0)開始工作。如果精靈的中心不在(0,0)處,那麼它將成爲偏離中心的比例。 – Empyrean 2010-09-09 17:52:36

0

要在崇高,的回答拓展,3D世界通常有至少四個座標系統,每個都有自己的本地原點:

  • 對象空間
  • 世界空間
  • 相機空間
  • 查看空間(2D!)

與三個轉變:

  • 對象世界
  • 世界到相機
  • 相機查看

您可以創建新的座標系,例如 '模型空間',隨着'模型到對象'的轉變。用這種方法,你會得到一系列步驟:

型號 - >秤 - >對象 對象 - >旋轉 - >翻譯 - >世界 世界 - >旋轉 - >翻譯 - >相機 攝像機 - >視角 - >查看

在OpenGL中,您將按照上面列出的相反順序推送矩陣,因此模型 - >對象轉換是最後一次推送,並且OpenGL應該正確呈現對象。我會假設XNA/DirectX有一個類似的系統。

變得越來越複雜,模型空間可以在樹中具有層次轉換,縮放和旋轉以產生骨架系統,然後可以使用該骨架系統使模型網格變形。這通常稱爲剝皮。

所以,要回答這個問題,例如,根據您應用旋轉變換的轉換,您將得到不同的結果。在模型 - >對象轉換中,模型將圍繞對象的原點進行旋轉。在對象 - >世界轉換中,對象將圍繞世界的原點旋轉。