Xna SpriteBatch Matrix.Decompose()

sma*_*007 5 xna 2d

我想要做的是能够将变换矩阵推入和弹出到 SpriteBatch 中。我有 2 个精灵,父级和子级,子级应该相对于父级进行缩放、旋转和平移。

我目前有一个使用纹理四边形的实现,但我认为这应该可以使用内置的 SpriteBatch 类和使用 Matrix.Decompose()。不过,我不确定如何将分解后的值传递给 SpriteBatch。

我了解如何保留矩阵堆栈,我只是在寻找一个使用来自 Matrix.Decompose() 的值与 SpriteBatch 结合的示例。

sma*_*007 6

终于自己想通了这个。不过,大部分功劳都属于这篇博文

您可以使用此方法来分解您的矩阵:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样构建叶精灵的变换矩阵:

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

对于您的父精灵,包括原点:

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));
Run Code Online (Sandbox Code Playgroud)

以相反的顺序乘以堆栈中的所有矩阵。