Как найти преобразованные в поворот 2D-координаты в XNA?

2

Я делаю XNA-игру и столкнулся с небольшой проблемой, вычислив немного векторной математики.

У меня есть класс, представляющий 2D-объект с целыми координатами X и Y и поплавок вращения. Мне нужно иметь свойство Vector2 для позиции, которое получает и устанавливает X и Y как вектор2, который был преобразован с помощью float вращения. Таким образом я могу просто сделать что-то вроде:

Position += new Vector2((thumbstick.X * scrollSpeed), -(thumbstick.Y * scrollSpeed));

и объект будет двигаться в своем собственном направлении вверх, а не в направлении вверх.

До сих пор это то, что у меня есть... Я думаю, что набор прав, но для + = изменений он нуждается в получении, а ответ просто не подходит ко мне прямо сейчас... > . >

public Vector2 Position
{
    get
    {
        // What goes here? :S
    }
    set
    {
        X = value.X * (int)Math.Cos(this.Rotation);
        Y = value.Y * (int)Math.Cos(this.Rotation);
    }
}
Теги:
graphics
2d
xna

3 ответа

7

Нет, оба неверны.

2D-вектор преобразуется следующим образом:

x' =  x*cos(angle) - y*sin(angle)
y' =  x*sin(angle) + y*cos(angle)

где угол измеряется в радианах, нулевой угол вдоль положительной оси х и увеличивается против часовой стрелки при вращении вокруг оси z из плоскости. Центр вращения находится в конце преобразуемого вектора, поэтому представьте вектор с началом в точке (0,0), концом при (x, y) вращением на угол, пока он не станет вектором с началом в точке (0,0 ) и заканчивается на (x ', y').

  • 1
    Неважно, в каких единицах измерения измеряется угол, поскольку в обоих уравнениях это одна и та же единица измерения :-)
  • 2
    Каждая реализация тригонометрических функций, о которой я знаю, использует радианы, поэтому в этом смысле это, безусловно, имеет значение. Подумайте, радианы, если вы используете компьютер для решения этой проблемы.
3

Вы также можете использовать вспомогательные методы Matrix для создания матрицы вращения Z, а затем умножить свой вектор на это, чтобы повернуть его. Что-то вроде этого:

Vector v1;
Matrix rot = Matrix.CreateRotationZ(angle);
Vector v2 = v1 * rot;
1

Я думаю, что это плохая идея. Храните все координаты X и Y ваших объектов в одних и тех же плоскостях вместо каждого из них, имеющих собственные оси. Во всех смыслах есть свойства Position и Heading и рассмотрим возможность использования метода Move, который берет ваш входной вектор и выполняет математику для обновления позиции и заголовка.

  • 0
    Вот почему я хочу сделать его собственностью. Вы можете либо напрямую ссылаться на координаты X и Y, либо использовать свойство, чтобы получить или установить их так, как если бы они находились в повернутой плоскости. Это значительно облегчает вычисление элементов управления движением объекта, который меняет направление в зависимости от того, куда указывает его вращение.
  • 0
    Не уверен, что я согласен - я думаю, что это будет сбивать с толку.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню