Я пытаюсь масштабировать некоторые значения скорости x и y, чтобы они находились между -MAX и MAX, и поддерживаю их пропорции. Числа могут быть отрицательными, нулевыми или положительными. Это используется для обеспечения ограничения скорости по скоростям x и y. Вот что у меня есть:
if(abs(velocities.x) <= MAX_TRANSLATIONAL_VELOCITY && abs(velocities.y) <= MAX_TRANSLATIONAL_VELOCITY)
return;
float higher = max(abs(velocities.x), abs(velocities.y));
velocities.x = (velocities.x / higher) * MAX_TRANSLATIONAL_VELOCITY;
velocities.y = (velocities.y / higher) * MAX_TRANSLATIONAL_VELOCITY;
Это на самом деле не работает, и роботы, к которым я применяю это, как бы разряжаются. Есть ли стандартный способ сделать это?
Благодарю.
Чтобы нормализовать вектор, вы не должны делить его компоненты на максимум любого из них, но на их величину, которая является евклидова норма вектора.
На самом деле вы не должны проверять отдельный компонент, сначала вы рассчитываете величину, затем, если она больше MAX_MAGNITUDE, вы нормализуете вектор и умножаете его на MAX_MAGNITUDE.
float magnitude = sqrt(v.x*v.x + v.y*v.y);
if (magnitude > MAX_MAGNITUDE)
{
v /= magnitude; // I'm assuming overloaded operators here
v *= MAX_MAGNITUDE;
}
Других решений пока нет …