2010-02-26 70 views
4

我正在做的是能夠將變換矩陣推送到SpriteBatch。我有2個精靈,父母和孩子,孩子應該縮放,旋轉,相對於父母進行翻譯。Xna SpriteBatch Matrix.Decompose()

我目前有一個使用紋理四邊形的實現,但我認爲這應該有可能使用內置的SpriteBatch類和使用Matrix.Decompose()。我不知道如何將分解的值傳遞給SpriteBatch,只要我已經分解了它們。

我明白如何保持矩陣堆棧,我只是尋找一個使用來自Matrix.Decompose()和SpriteBatch的值的例子。

回答

4

終於自己把這個弄出來了。雖然大部分信用屬於此blog post

您可以使用此方法來分解你的矩陣:

private void DecomposeMatrix(ref Matrix matrix, out Vector2 position, out float rotation, out Vector2 scale) 
{ 
    Vector3 position3, scale3; 
    Quaternion rotationQ; 

    matrix.Decompose(out scale3, out rotationQ, out position3); 

    Vector2 direction = Vector2.Transform(Vector2.UnitX, rotationQ); 
    rotation = (float)Math.Atan2((double)(direction.Y), (double)(direction.X)); 
    position = new Vector2(position3.X, position3.Y); 
    scale = new Vector2(scale3.X, scale3.Y); 
} 

你可以再建一個變換矩陣的葉精靈,像這樣:

Matrix transform = 
    Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) * 
    Matrix.CreateRotationZ(this.Rotation) * 
    Matrix.CreateTranslation(new Vector3(this.Position, 0)); 

對於你的父母精靈,包括產地:

Matrix transform = 
    Matrix.CreateTranslation(new Vector3(-this.Origin, 0)) * 
    Matrix.CreateScale(new Vector3(this.Scale, 1.0f)) * 
    Matrix.CreateRotationZ(this.Rotation) * 
    Matrix.CreateTranslation(new Vector3(this.position, 0)); 

以相反的順序乘以堆棧中的所有矩陣。

+0

我一直在尋找如何從一個變換矩陣的四元數到一個SpriteBatch可以使用的浮點數,這絕對是。對於任何人來說,你會注意到matrix.Decompose(...)返回一個布爾值。我不建議把它放在if語句中。無論對我而言,它似乎都會返回錯誤,但仍會輸出正確的比例,旋轉和位置值。 – BrettMStory 2016-09-25 11:36:00