2010-02-26 72 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