В настоящее время я пишу некоторые функции для решения упругих столкновений в C++. Я столкнулся с камнем преткновения при работе с движущимся объектом, сталкивающимся с неподвижным объектом, потому что вычисления требуют, чтобы неподвижный объект имел бесконечную массу.Представление бесконечности в вычислениях физики
Я знаю, что std::numeric_limits
предоставляет infinity()
, но я не уверен, что это совершенно полезно в этом случае, поскольку, насколько мне известно, это просто максимальное число, возможное в представлении с плавающей запятой. В следующем коде, если aabb_obj
имеет массу, равную std::numeric_limits<double>::max()
, кажется, что каждый расчет, который ее использует, либо приведет к std::numeric_limits<double>::max()
, либо 0
.
double t;
if (intersect_moving_circle_aabb(circle_obj, aabb_obj, t))
{
circle_obj->position += circle_obj->velocity * t;
vec2 closest_point;
closest_pt_point_aabb(circle_obj->position, aabb_obj, closest_point);
vec2 n = (closest_point - circle_obj->position).normalized();
double a = dot_product(circle_obj->velocity, n);
double p = (2.0 * a)/(circle_obj->mass + aabb_obj->mass);
circle_obj->velocity = circle_obj->velocity - p * aabb_obj->mass * n;
}
Это игра, поэтому результаты не должны быть на 100% точными, точными, достаточно хорошими. Каков рекомендуемый способ представления бесконечности в таких расчетах? Я просто выбираю произвольно большое число?
Полезного приближение было бы дать объект в «недвижимое» имущество, которое вы проверяете, прежде чем пытаться обновить его векторы. Кроме того, вы можете установить массу объекта 'std :: numeric_limits :: max()', чтобы помочь в вычислении векторов движимого объекта. Это будет работать достаточно хорошо, если вы захотите также переключиться на интегральные типы. –