Xna SpriteBatch Matrix.Decompose () - PullRequest
       8

Xna SpriteBatch Matrix.Decompose ()

4 голосов
/ 26 февраля 2010

Что я хочу сделать, так это уметь выталкивать и вставлять матрицы преобразования в SpriteBatch. У меня есть 2 спрайта, родитель и ребенок, и ребенок должен быть масштабирован, повернут, переведен относительно родителя.

В настоящее время у меня есть реализация, использующая текстурированные квадраты, но я думаю, что это должно быть возможно с использованием встроенного класса SpriteBatch и использования Matrix.Decompose (). Я не уверен, как передать разложенные значения в SpriteBatch после их разложения.

Я понимаю, как сохранить матричный стек, я просто ищу пример использования значений из Matrix.Decompose () в сочетании с SpriteBatch.

1 Ответ

4 голосов
/ 28 февраля 2010

Наконец-то понял это сам. Большая часть кредита принадлежит этому сообщению в блоге , хотя.

Вы можете использовать этот метод для декомпозиции вашей матрицы:

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));

Умножить на все матрицы в стеке в обратном порядке.

...