Я делаю 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);
}
}
Нет, оба неверны.
2D-вектор преобразуется следующим образом:
x' = x*cos(angle) - y*sin(angle)
y' = x*sin(angle) + y*cos(angle)
где угол измеряется в радианах, нулевой угол вдоль положительной оси х и увеличивается против часовой стрелки при вращении вокруг оси z из плоскости. Центр вращения находится в конце преобразуемого вектора, поэтому представьте вектор с началом в точке (0,0), концом при (x, y) вращением на угол, пока он не станет вектором с началом в точке (0,0 ) и заканчивается на (x ', y').
Вы также можете использовать вспомогательные методы Matrix для создания матрицы вращения Z, а затем умножить свой вектор на это, чтобы повернуть его. Что-то вроде этого:
Vector v1;
Matrix rot = Matrix.CreateRotationZ(angle);
Vector v2 = v1 * rot;
Я думаю, что это плохая идея. Храните все координаты X и Y ваших объектов в одних и тех же плоскостях вместо каждого из них, имеющих собственные оси. Во всех смыслах есть свойства Position
и Heading
и рассмотрим возможность использования метода Move
, который берет ваш входной вектор и выполняет математику для обновления позиции и заголовка.