代码之家  ›  专栏  ›  技术社区  ›  smack0007

xna spritebatch matrix.decompose()

  •  4
  • smack0007  · 技术社区  · 15 年前

    我要做的是能够将转换矩阵推送并弹出到spritebatch中。我有两个精灵,父精灵和子精灵,子精灵应该相对于父精灵进行缩放、旋转和转换。

    我目前有一个使用纹理四边形的实现,但我认为这应该可以使用内置的spritebatch类和matrix.decompose()来实现。不过,我不知道分解后的值如何传递给spritebatch。

    我知道如何保存矩阵堆栈,我只是在寻找一个使用matrix.decompose()和spritebatch中的值的例子。

    1 回复  |  直到 15 年前
        1
  •  4
  •   smack0007    15 年前

    我终于自己弄明白了。大部分功劳都属于这个 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));
    

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