Как найти преобразованные в поворот 2D-координаты в XNA? - PullRequest
2 голосов
/ 01 августа 2009

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

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

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);
    }
}

Ответы [ 3 ]

7 голосов
/ 01 августа 2009

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

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

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

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

3 голосов
/ 04 августа 2009

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

Vector v1;
Matrix rot = Matrix.CreateRotationZ(angle);
Vector v2 = v1 * rot;
1 голос
/ 02 августа 2009

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

...