現在、C++ でエラスティック コリジョンを処理する関数をいくつか作成しています。動かない物体に衝突する動く物体を扱うとき、つまずきにぶつかりました。これは、計算上、動かない物体の質量が無限である必要があるためです。
提供していることは承知していstd::numeric_limits
ますinfinity()
が、私が知る限り、これは浮動小数点表現で可能な最大数にすぎないため、この場合に完全に役立つかどうかはわかりません。次のコードでは、 if aabb_obj
has mass equal to std::numeric_limits<double>::max()
it を使用するすべての計算の結果が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% 物理的に正確である必要はなく、「十分」である必要があります。そのような計算で無限を表すための推奨される方法は何ですか? 任意に高い数値を選択するだけですか?