私が理解している限りでは、重力を実装するためのかなり標準的な方法があります。これはほとんど本物です。各時間ステップでオブジェクトの下向きの垂直速度に数値 (たとえば 9.8) を追加します。
ただし、この単純な計算により、私のプログラム (および明らかに他のプログラム) で「無限バウンス」の問題が発生しました。これまでの単純なテスト ケースでは、ボールが真っ直ぐ下に落ちて「床」に当たりました。衝突すると、ボールのベクトルは偏向し、1/4 (プレースホルダーの反発係数) だけ減少します。すべての時間ステップで、重力値 (私の場合は約 2) がベクトルに追加されます。その結果、ボールはバウンドし、さらに低くバウンドします...そして、実際に停止したり、視覚的に停止したりするのではなく (本当のゴール)、画面の下部で上下に揺れます。デバッグの読み取り値は、定数が追加され、キャンセルされ、再び無期限に追加され続けるため、2、3 フレーム以上速度が 2 を下回らないことを示しています。
さて、その理由を理解することは難しいことではありません。それはまさに私が最初から恐れていたことです.数学を説明するときに誰も実際にそのような問題に言及していないので、見落としていた数学の魔法があると思いました. しかし、誰もそれについて議論していないので、それを修正するための「典型的な」方法は何ですか?
編集:かなりの作業の後、別々の加速度値を単独で使用しても問題は解決しないと判断しました.それでも常に一定の重力の割合を追加しようとします. 一定のタイム ステップは一定の加速度を意味します。一定の加速度とは、一定の速度増加を意味します。バウンス時の反発係数により、速度がポイントに減少し、加速が打ち消されますが、加速は 0 から始まります。
- 加速度は 0 から始まり、速度は y から始まります。
- (grav * timestep) でインクリメントされる加速度。
- 加速度によって増加する速度。
- 床に衝突するまで 2 ~ 3 を繰り返します。
- 加速度が 0 に戻りました。
- それに応じて速度ベクトルが反映され、CoR が乗算されます。
- 速度が負から 0 になり、再び正になるまで、2 ~ 3 を繰り返します。
- 2 ~ 7 を繰り返します。各バウンスは前回よりも少ない運動量を維持します。
- バウンスは非常に小さくなりました。
- 速度は (grav * timestep) 未満になりました。
- 床に衝突すると、加速度が 0 に戻ります。
- 加速度が再び (grav * timestep) 増加しました。
- 速度は加速によって増加します。これで、マイナスからプラスに一気にスイングするのに十分です。
- 11~13を無限に繰り返します。
さて、全体的な問題は、速度が決して 0 に等しくならないということではありません。これは予想されることです。しかし、期待されているのは、無限に減少する数です。Coefficient of Restitution を 0.5 に設定すると、結果のバウンス速度は最後の速度の半分になり、「停止」として破棄できるまで徐々に減少します。純粋な一定の追加を導入することにより (速度に直接追加する場合でも、速度に追加される別の値に追加する場合でも)、この問題が発生します。具体的には、それを解決する方法を知る必要があります。