Векторные углы XNA 2D - как правильно рассчитать? - PullRequest
12 голосов
/ 17 февраля 2010

что в XNA в 2D стандартным образом работают векторные углы?

0 градусов, вправо, 90 пунктов вверх, 180 влево, 270 вниз?

Каковы «стандартные» реализации

float VectortoAngle(Vector2 vec)

и

Vector2 AngleToVector(float angle)

так, чтобы VectortoAngle (AngleToVector (PI)) == PI?

Ответы [ 2 ]

20 голосов
/ 17 февраля 2010

Для ответа на ваш первый вопрос: 0 градусов вверх, 90 градусов вправо, 180 градусов вниз и 270 градусов влево. Здесь - это простое руководство по ротации 2D XNA, которое даст вам больше информации.

Что касается преобразования векторов в углы и обратно, я нашел пару хороших реализаций здесь :

Vector2 AngleToVector(float angle)
{
    return new Vector2((float)Math.Cos(angle), (float)Math.Sin(angle));
}

float VectorToAngle(Vector2 vector)
{
    return (float)Math.Atan2(vector.Y, vector.X);
}

Кроме того, если вы новичок в 2D-программировании, вы можете захотеть взглянуть на Torque X 2D , который предоставит вам множество возможностей. Если вы заплатили за разработку для XNA, вы получаете двоичные файлы движка бесплатно, и есть служебный класс, который конвертирует из углов в векторы и обратно, а также другие полезные функции, подобные этой.

Редактировать: Как отметил Раньери в комментариях, эта функция не имеет смысла, когда вверх равен 0 градусов. Вот тот, который делает (вверх равен (0, -1), справа это (1, 0), вниз это (0, 1), слева это (-1, 0):

Vector2 AngleToVector(float angle)
{
    return new Vector2((float)Math.Sin(angle), -(float)Math.Cos(angle));
}

float VectorToAngle(Vector2 vector)
{
    return (float)Math.Atan2(vector.X, -vector.Y);
}

Я также хотел бы отметить, что некоторое время я использовал Torque, и он использует 0 градусов для повышения, так что вот где я получил эту часть. Это означает, что в этом случае выведите текстуру на экран так же, как в файле. Так что вниз будет рисовать текстуру вверх ногами.

1 голос
/ 25 февраля 2010

Не существует соглашения о том, какое направление представляет определенный угол в XNA, поэтому вы можете просто определить его так, как вам нравится.

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

...