我目前正在编写一些函数来处理 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% 物理准确,只要“足够好”即可。在此类计算中表示无穷大的推荐方法是什么?我只是选择一个任意高的数字吗?