Xna SpriteBatch Matrix.Decompose()

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

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

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


person smack0007    schedule 26.02.2010    source источник


Ответы (1)


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

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

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

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

person smack0007    schedule 28.02.2010
comment
Я все время искал, как перейти от кватерниона матрицы преобразования к веществу с плавающей запятой, которое может использовать SpriteBatch, и это абсолютно то, что нужно. Для тех, кто придет к этому, вы заметите, что matrix.Decompose(...) возвращает логическое значение. Я не предлагаю помещать это в оператор if. Оказалось, что он возвращает false независимо от того, что для меня, но все равно выводит правильные значения для масштаба, поворота и положения. - person BrettMStory; 25.09.2016