3

ボールが跳ね回っていて、衝突するたびに速度ベクトルが反発係数によって減少します。

現在、私のボールの CoR は .80 です。そのため、何度もバウンドした後、ボールの速度が途方もなく小さい数値になったため、ボールの回転が「停止」しました。

どの段階で、速度値が単純にゼロと呼ぶのに十分小さいかどうかを確認するのが適切です (そのため、ボールが微小速度に反応して狂ったようにジッタリングすることはありません)。以前にいくつかのフォーラムで、人々がイプシロン定数、いくつかの小さな数を使用してそれに対してチェックすることを読んだことがあります。

イプシロン定数を定義して、次のようにする必要があります。

if Math.abs(velocity.x) < epsilon then velocity.x = 0

ボールの速度と位置を更新するたびに? これは一般的に行われていることですか?x と y の Vector クラス セッターにそれを配置することは合理的でしょうか? または、速度を計算しているときに、ベクトル クラスの外で行う必要があります。

また、速度ベクトルに float を使用している場合、妥当なイプシロン値は何でしょうか?

4

4 に答える 4

1

イプシロンの妥当な値は、システムの制約によって異なります。ボールをグラフィカルに表現している場合、イプシロンは、たとえば1秒あたり0.1ピクセルの速度に対応する可能性があります(停止の概念が、画面オブジェクトの停止に関するユーザーエクスペリエンスと一致することを確認してください)。物理シミュレーションを実行している場合は、システムを測定しようとしている精度に合わせて調整する必要があります。

チェックする頻度については、それも異なります。リアルタイムで何かをシミュレートしている場合、追加のチェックにはコストがかかる可能性があり、10回の更新ごと、または1秒に1回などをチェックする必要があります。または、パフォーマンスは問題ではない可能性があり、更新のたびに確認できます。

于 2008-12-10T00:23:54.397 に答える
1

IsStillMoving 関数のイプシロンの代わりに、速度に基づいてオブジェクトごとにスケジュールされた UpdatePosition 関数を使用できます。

私は次のようなことをします(私自身のmake-it-up-as-you-go疑似コードで):

void UpdatePosition(Ball b) {

   TimeStamp now = Clock.GetTime();
   float secondsSinceLastUpdate = now.TimeSince(b.LastUpdate).InSeconds;

   Point3D oldPosition = b.Position;
   Point3D newPosition = CalculatePosition(b.Position, b.Velocity, interval);
   b.MoveTo(newPosition);

   float epsilonOfAccuracy = 0.5; // Accurate to one half-pixel
   float pixelDistance = Camera.PixelDistance(oldPosition, newPosition);
   float fps = System.CurrentFramesPerSecond;
   float secondsToMoveOnePixel = (pixelDistance * secondsSinceLastUpdate) / fps;
   float nextUpdateInterval = secondsToMoveOnePixel / epsilonOfAccuracy;

   b.SetNextUpdateAt(now + nextUpdateInterval);
}

非常に速く動くボールは、フレームごとに更新されます。よりゆっくりと移動するボールは、5 または 10 フレームごとに更新される可能性があります。また、停止した (またはほぼ停止した) ボールは、ごくまれにしか更新されません。

于 2008-12-10T00:43:55.247 に答える
0

イプシロンは本質的に最小の増分です。残念ながら、コンピューターには、浮動小数点表現に応じて、独自の「最小」インクリメントが異なります。特にコードを移植可能にしたい場合は、非常に注意して(安全のために計算した値よりも高くなる可能性さえあります)、それをいじります。

魔法の値を使用するのではなく、float の最小増分を計算する関数を作成したい場合があります。

于 2008-12-10T00:49:39.307 に答える
0

IMOあなたのイプシロンアプローチは問題ありません。ゲーム内のアニメーションが自然に見えるかどうかを実験してみます。

于 2008-12-10T00:14:32.593 に答える