Неправильное вращение SpriteBatch - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь заставить повернутый Texture2D правильно вписаться / заполнить границы повернутого Polygon (мой собственный класс), но он отказывается работать должным образом.Используемый мной метод SpriteBatch:

spriteBatch.Draw(texture, new Rectangle((int)Position.X, (int)Position.Y, Width, Height), null, color, Rotation, Vector2.Zero, SpriteEffects.None, 1.0f);

Однако, единственными важными битами в этом являются Rectangle и источник, который в настоящее время установлен на Vector2.Zero,Когда вышеприведенный код запускается, он создает это изображение, где Texture2D (закрашенный красный квадрат) смещен от Polygon (каркас извести) на значение (texture.Width / 2, texture.Height / 2).Однако вращение правильное, поскольку обе фигуры имеют параллельные стороны.

Я пытался:

spriteBatch.Draw(texture, new Rectangle((int)Position.X, (int)Position.Y, Width, Height), null, color, Rotation, new Vector2(Width / 2, Height / 2), SpriteEffects.None, 1.0f);

Единственная разница в этом вызове состоит в том, что я изменил источник (точка, в которой Texture2D должен повернуть) в new Vector2(Width / 2, Height / 2), что приводит к этому изображению, где Texture2D смещено от Polygon на значение (-Width, -Height), но все еще вращается с Polygon.

Другая ошибка, которая возникает, заключается в том, что при использовании другого Texture2D с шириной и высотой, отличной от первого, хотя это должно дать тот же результат, так как поле destinationRectangle не изменяется.- в программе все по-другому, как показано на этом изображении.Опять же, здесь используется точно такой же вызов , что и предыдущий, только с другим изображением (с разными размерами).

Любая помощь по любому из этих вопросов будет принята с благодарностью.Спасибо!

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Ответ на обе мои проблемы лежит в одной ошибке:

SpriteBatch применяет вращение вокруг начала координат до применения масштабного перевода.

Чтобы объяснить это, вот пример:

У вас есть Texture2D размера (16, 16), и вы хотите, чтобы он заполнил (48, 48) размера destinationRectangle при вращении вокруг начальной точки (destinationRectangle.Width / 2, destinationRectangle.Height / 2) (что равно (24, 24)). Итак, вы хотите получить квадрат, повернутый вокруг его центральной точки.

Сначала SpriteBatch повернет Texture2D вокруг точки (24, 24), что, поскольку Texture2D еще не масштабировано и, следовательно, имеет размер (16, 16), приведет к неправильному и неожиданному результату. После этого он будет масштабирован, сделав его просто увеличенной версией плохо повернутого квадрата.

Чтобы устранить эту проблему, используйте (texture.Width / 2, texture.Height / 2) вместо (destinationRectangle.Width / 2, destinationRectangle.Height / 2) в качестве исходной точки.

Пример: spriteBatch.Draw(texture, new Rectangle((int)Position.X, (int)Position.Y, Width, Height), null, color, Rotation, new Vector2(texture.Width / 2, texture.Height / 2), SpriteEffects.None, 0f);

Дополнительное объяснение можно найти здесь и здесь .

0 голосов
/ 03 апреля 2019

Исходная точка регулирует центр вращения на основе исходного прямоугольника. (Когда передается как null, как в вашем случае, исходный прямоугольник представляет собой всю текстуру.

Помните, что порядок важен для перевода, вращения и масштабирования.

Вращение применяется в переведенном начале исходного прямоугольника, что позволяет вращать отдельные кадры листа спрайта.

Следующий код должен выдавать ожидаемый результат:

spriteBatch.Draw(texture, new Rectangle((int)Position.Center.X, (int)Position.Center.Y, Width, Height), null, color, Rotation, new Vector2(texture.Width / 2, texture.Height / 2), SpriteEffects.None, 1.0f);
0 голосов
/ 02 апреля 2019

http://www.monogame.net/documentation/?page=M_Microsoft_Xna_Framework_Graphics_SpriteBatch_Draw

Для правильного вращения необходимо убедиться, что origin правильно,

Либо это будет 0.5f, 0.5f, если это нормализованное значение, иначе этобыть width / 2.0f, height / 2.0f.

или любым другим подходящим углом для поворота в вашем случае.

...