Получение правильного вращения от направления вектора - PullRequest
2 голосов
/ 20 ноября 2011

У меня сейчас есть код в моей игре:

Vector2 pixelpos = new Vector2(x, y);
Vector2 center = new Vector2(t.Width / 2, t.Height / 2);

Vector2 pixelposWorld = (pixelpos - center);

float rotation = (float)Math.Atan2(pixelposWorld.Y, pixelposWorld.X);
float rotationPercent = (MathHelper.ToDegrees(rotation) / 360);

Моя цель состоит в том, чтобы в результате значение TurnPercent было равно 0,0-1,0, 0 градусов - 0,0, 180 - 0,5 и 360 - 1,0.

В настоящее время вращениеPercent имеет значение только 1.0.

Что я могу сделать, чтобы это исправить?

Ответы [ 3 ]

4 голосов
/ 20 ноября 2011

Прежде всего, в вашем случае нет необходимости преобразовывать его в градусы, поскольку Math.aTan2 возвращает угол в радианах, просто разделите переменную вращения на (2 * Pi).

Во-вторых, проверьте, что вы делаете в «t.Width / 2, t.Height / 2», так как вы не указали в своем вопросе, что такое «t», убедитесь, что его члены не являются целыми числами.

Теперь, что касается самой вашей проблемы, недостаточно предоставленной информации. Где это содержит вашу информацию о ротации? Является ли вектор «pixelpos» вашей позицией в мире или вы также используете это как вращение?

Приведенный к минимуму следующий код работает примерно так, как вы описали?

Vector2 pixelpos = new Vector2(0, 1);
float rotation = (float)(Math.Atan2(pixelpos.Y, pixelpos.X) / (2 * Math.PI));

Что дает 0,25 или 90 градусов.

1 голос
/ 11 июля 2013

Лучший способ рассчитать это было бы через использование точечных продуктов:

Vector2 pixelposWorld = Vector2.Normalize(pixelpos - center);
float dot = Vector2.Dot(Vector2.UnitX, pixelposWorld);
float rotation = (pixelposWorld.Y >= 0)
                 ? (1f - dot) / 4f
                 : (dot + 3f) / 4f;

Просто скажу, что это в среднем на 120% быстрее (я запускал тесты).

0 голосов
/ 20 ноября 2011

Я думаю, что вы забыли использовать float в 360, он должен быть 360f.

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