终于自己把这个弄出来了。虽然大部分信用属于此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));
以相反的顺序乘以堆栈中的所有矩阵。
我一直在寻找如何从一个变换矩阵的四元数到一个SpriteBatch可以使用的浮点数,这绝对是。对于任何人来说,你会注意到matrix.Decompose(...)返回一个布尔值。我不建议把它放在if语句中。无论对我而言,它似乎都会返回错误,但仍会输出正确的比例,旋转和位置值。 – BrettMStory 2016-09-25 11:36:00