В моей игре есть объекты, которые движутся быстрее на 45 градусов, чем на 90 градусов.
Каждый объект имеет
- Точка (х, у) позиция
- Направление Vector2D (x, y)
- Int скорость
И что я делаю во время обновления, так это то, что новая позиция рассчитывается как:
position.x += direction.x * speed
position.y += direction.y * speed
Как мне это исправить? Я хочу, чтобы он двигался с одинаковой скоростью под любым углом.
Ответы:
Это можно объяснить с помощью теоремы Пифагора , которая имеет следующую формулу:
В вашем случае при движении вправо вы используете (x: 1, y: 0), что дает нам
При движении вверх и вправо вы используете (x: 1, y: 1), что дает нам
Итак, как вы можете видеть, длина по диагонали больше, чем длина по кардинальным осям.
Как уже упоминали другие, вы должны просто нормализовать ваш вектор направления. Если вы используете XNA, это делается так:
источник
Нормализуйте вектор направления перед использованием.
Как объяснил MindWorX, это может быть просто понято, если вы беспокоитесь о своих векторах направления, которые могут причинить вам горе, убедитесь, что они являются единичными векторами (величина / длина 1).
Если нормализовано:
источник
Как вы рассчитываете свое направление? Если 45 градусов
(1,1)
, то это, безусловно, будет быстрее, чем 90 градусов(1,0)
.Я предлагаю вам использовать что-то вроде этого:
Чтобы получить угол в радианах, вам нужно умножить свои градусы на
PI / 180
или даже лучше, используйтеMathHelper
. Например.источник
Джейсон,
Вместо того, чтобы иметь три атрибута объекта,
часто намного проще объединить направление и скорость в вектор скорости. Тогда у вас есть только два атрибута,
Обновление позиции
Когда вам нужно обновить позицию объекта, это так просто:
где
Δt
ваша дельта времени - или разница во времени - или шаг по времени.Обновление позиции и скорости
Это также очень легко справиться с ускорением (например, от силы тяжести). Если у вас есть вектор ускорения, вы можете обновить скорость и положение вместе следующим образом:
(Это в основном формула s = vt + ½at² из физики 101.)
Применяя скорость
Если вы хотите применить заданную скорость в некотором нормализованном направлении, вы можете установить скорость следующим образом:
Получение скорости
И если вам нужно сделать обратное - вывести скорость и направление из заданного вектора скорости - вы можете просто использовать теорему Пифагора или
.Length()
метод:И как только скорость известна, нормализованное направление может быть вычислено путем деления скорости на скорость (будьте осторожны, чтобы не делить на ноль):
источник