我要做的是能够将矩阵推送和弹出转换为SpriteBatch。我有2个精灵,父母和孩子,孩子应该相对于父母进行缩放,轮换,翻译。
我目前有一个使用纹理四边形的实现,但我认为这应该可以使用内置的SpriteBatch类并使用Matrix.Decompose()。我不确定在分解它们之后如何将分解的值传递给SpriteBatch。
我理解如何保留矩阵堆栈,我只是在寻找使用来自Matrix.Decompose()和SpriteBatch的值的示例。
答案 0 :(得分: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));
以相反的顺序乘以堆栈中的所有矩阵。