Я только начинаю в XNA и у меня вопрос о ротации. Когда вы умножаете вектор на матрицу вращения в XNA, он идет против часовой стрелки. Это я понимаю.
Однако позвольте мне привести вам пример того, чего я не понимаю. Допустим, я загружаю случайный художественный актив в конвейер. Затем я создаю некоторую переменную для увеличения каждого кадра на 2 радиана при запуске метода обновления (testRot + = 0.034906585f). Главное, что я запутался, это то, что ресурс вращается по часовой стрелке в этом пространстве экрана. Это смущает меня, поскольку матрица вращения будет вращать вектор против часовой стрелки.
Еще одна вещь, когда я указываю, где находится мой вектор положения, а также мое происхождение, я понимаю, что я вращаюсь вокруг начала координат. Могу ли я предположить, что есть перпендикулярная ось, проходящая через источник этого актива? Если так, откуда начинается вращение? Другими словами, я начинаю вращение с вершины оси Y или оси X?
XNA SpriteBatch работает в клиентском пространстве . Где «вверх» - это Y-, а не Y + (как в декартовом пространстве, пространстве проекции и том, что большинство людей обычно выбирают для своего мирового пространства). Это заставляет вращение отображаться по часовой стрелке (а не против часовой стрелки, как в декартовом пространстве). Фактические координаты вращения такие же.
Вращения относительны, поэтому на самом деле они не «начинаются» с какой-либо указанной позиции.
Если вы используете математические функции, такие как sin
или cos
или atan2
, то абсолютные углы всегда начинаются с оси X + как нулевые радианы, а положительное направление вращения поворачивается в сторону Y +.
Порядок операций SpriteBatch
выглядит примерно так:
SourceRectangle
). SpriteBatch.Begin
Это поместит спрайт в пространство клиента.
Наконец, к каждому пакету применяется матрица для преобразования этого клиентского пространства в пространство проекции, используемое графическим процессором. (Пространство проекции составляет от (-1, -1) в нижнем левом углу окна просмотра до (1,1) в правом верхнем углу.)