Векторное движение относительно вращения - PullRequest
4 голосов
/ 21 марта 2012

Скажем, у меня есть вектор (x, y), и он выровнен относительно начала координат (скажем, указывая на 30 градусов вверх).

Если я хочу переместить этот вектор на одну единицу относительно направления (то есть, на одну единицу вперед, на 30 градусов вверх), как мне поступить?

Я работаю над созданием простой игры от третьего лица, и я хотел бы иметь возможность вращать персонажа и перемещать его вперед независимо от поворота, и я вроде как потерян, как это сделать.

EDIT:

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

Учитывая код Гюнтера2, Чтобы получить движение назад, просто вычтите смещение из текущей позиции:

position -= displacement;

Чтобы получить левое движение, измените переменные смещения на

displacement.x = (float)Math.Sin(angle + PI/2); 
displacement.y = (float)Math.Cos(angle + PI/2);

Замените PI / 2 на 90, если Sin / Cos принимает градусы вместо радианов.

Затем вычтите смещение:

position -= displacement;

Чтобы получить правильное движение, просто выполните те же шаги, но добавьте новое смещение:

position += displacement;

1 Ответ

4 голосов
/ 21 марта 2012

Сначала вам понадобится вектор, представляющий угол:

Vector2 displacement;
displacement.x = (float)Math.Sin(angle);
displacement.y = (float)Math.Cos(angle);

Затем, поскольку длина этого вектора (x, y) всегда будет равна 1, вы умножаете его на то, как далеко вы путешествуете.,Если вы хотите пройти расстояние 1, то X и Y уже соответствуют размеру, который им необходим.

displacement *= speed;  // Assuming your Vector2 *= operator supports a scalar

Добавьте смещение к текущей позиции:

position += displacement;
...