XNA и матрицы - PullRequest
       27

XNA и матрицы

1 голос
/ 28 августа 2010

Итак, благодаря многим ответам с этой доски, я гораздо лучше понимаю, что скрывается под капотом, но мне просто нужно немного больше, чтобы получить твердое понимание.Итак, я читаю часть уроков Римера здесь:

http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Coll_Detection_Matrices.php

Я буду использовать пример каретки, так как он довольно прост.

Итак, последовательность преобразований длякаретка выглядит так:

1: Matrix.Identity;
2: Matrix.CreateTranslation(xPos, yPos, 0)
3: Matrix.CreateScale(playerScaling)
4: Matrix.CreateTranslation(0, -carriage.Height, 0)

Итак, мои вопросы таковы:

Riemer заявляет:

1: если бы мы визуализировали изображение таким, как оно есть(или: с преобразованием Identity), оно будет отображаться в своем первоначальном размере в верхнем левом углу экрана.

  1. Я не понимаю, в каком контексте это применимо,Имеет ли он в виду тот факт, что перед розыгрышем все изображения начинаются с начала координат мира 0,0?Или он говорит, что, когда эти преобразования вступят в силу, источник объекта теперь будет помещен в верхний левый угол и переведен обратно в начало мира?

2: Во-первых,изображение каретки перемещается, поэтому его верхняя левая точка находится в позиции, указанной в качестве второго аргумента в методе SpriteBatch.Draw.

Хорошо, он говорит, что это то, что происходит под капотом для того, что происходит во время метода рисования, или что он просто передает тот же параметр, что и то, что вы отправляете в метод рисования?

4: Наконец, и это самый сложный шаг: изображение перемещается по оси Y, поскольку в нашем методе SpriteBatch.Draw мы указали (0, carriageTexture.Height) в качестве источника.Очень важно: оно перемещается по собственной оси Y, , которое было уменьшено.Таким образом, вместо перемещения на 39 пикселей экрана, каретки будут перемещаться вертикально на 39 * 0,4 = 16 пикселей (поскольку carriageTexture.Height = 39 и playerScaling = 0,4).

Хорошо, мы позиционируем вещи с использованием этих матриц в нашем пространстве мира / экрана.Когда вы уменьшаете что-то, я не понимаю, почему оно теперь начнет двигаться в соответствии с локальным пространством объекта.Например, наша первая матрица перевода сместилась в соответствии с пространством мира / экрана, но теперь он заявляет, что «она перемещается по своей оси Y».

Почему матрица тождественности необязательна?

Таким образом, у меня возникли проблемы с подключением метода рисования к этим умножениям матриц, что за дело с объектом, направляющимся в начало мира, и почему трансляция создания изменила свое поведение.

1 Ответ

1 голос
/ 28 августа 2010

1.1: в этой системе по умолчанию изображения выводятся в верхнем левом углу.Не все системы такие, поэтому стоит указать это в документации.Поэтому, если ни одно из преобразований не применяется (или только единичное, которое ничего не делает), оно будет отображаться в верхнем левом углу.

2.1: После применения преобразования в строке 2 оно будет переводить (перемещать) изображение xPos, yPos по экрану.Когда именно это происходит, это не так важно, но, вероятно, оно будет применено видеокартой во время рисования.

4.1: Нет, вы всегда располагались по локальному пространству.Просто до третьей строки локальное пространство было того же размера, что и глобальное пространство.Теперь локальное пространство масштабируется, поэтому переводы также масштабируются.

4.2: Большинство систем инициализируют матрицы в единичную матрицу.Тождественная матрица по определению ничего не делает (если вы умножите ее на матрицу A, вы снова получите матрицу A).Так что, если вы пропустите это, это не имеет значения.Это полезно для того, чтобы быть явным или для сброса матрицы позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...