5

時間補正された Verlet と呼ばれる、Johnathan Dummer による Web で一般的に使用されているverlet 統合式があります。ただし、フォーラムの投稿をいくつか読んだことがありますが、特定の条件下で奇妙な結果や予期しない結果が得られるというものです。

ジョナサン・ダマーによる式:

x1 = x + (x – x0) * dt / dt0 + a * dt^2

ダマーの時間補正式が壊れており、ポスターが彼自身の派生を正しいものとして提示していると述べているスタックオーバーフローの回答もあります。

スタックオーバーフローの回答による推奨される正しい式

x1 = x + (x – x0) * dt / dt0 + a * dt * (dt + dt0) / 2

さて、ダマーの公式は本当に壊れているのでしょうか? はいの場合、ポスターの派生の方が優れていますか?

PS: ダマーがx1 = x - x0 + a * dt^2彼のウェブサイトで正しいx1 = 2x - x0 + a * dt^2.

4

3 に答える 3

8

ウィキペディアのページVerlet integration - Non-constant time differenceは、参照されていない 2 つの式を示しています。私は導出を自分で確認していませんが、2 番目の改良された式の理由は適切に見えます。

Dummer のスプレッドシートをダウンロードし、式の 1 つを修正して修正を使用しました。結果ははるかに優れています。

方法の比較

正確な結果は黄色で示されています。変動するフレームレートで通常の Verlet アルゴリズムを使用するだけでは良くないことがわかります。Dummer の赤の時間補正バリアントはかなり良いですが、少しずれています。補正が改善された濃い緑色のバージョンは、はるかに優れています。

二次解を持つ重力下の発射体の場合、改善されたバージョンが正確であることがわかる場合があります。次数が少し高くなると、実際のパスとは異なるため、より良い近似が得られるかどうかをテストする価値があるかもしれません.

罪の方法の比較

正弦曲線に対して同じ計算を行うと、改良された方法がかなり優れていることがわかります。ここでタイムコレクトVerletがかなりドリフトしています。改善されたバージョンの方が優れていますが、正確な答えから少しだけずれています。


PS用。TCV 式で dt=dt0 を設定すると、

x1 = x + (x – x0) * dt / dt0 + a * dt^2

あなたが得る

x1 = x + x – x0 + a * dt^2
   = 2 x – x0 + a * dt^2

オリジナルのヴェルレ製法。

于 2015-09-22T07:37:46.073 に答える
3

私は怠け者になるのをやめて、元の Verlet 法が可変ステップ サイズでどのように見えるかのある種の派生を示すことにしました。ダマーによるこの誤った適応は、私が思っていたよりも蔓延しているように見えるので、それは悲しいことです. また、上記の回答が指摘しているように、「推奨される正解」の後に追加されたものの、正しいバージョンがダマーのものと一緒にウィキペディアにあることにも気付きました。

Verlet 法を見ると、リープフロッグ、速度 Verlet、陰的 Euler などによく似ていることがわかります。これらは修正された中点の 2 次バージョンのように見え、それらのいくつかは同一である可能性があります。これらのそれぞれにおいて、ある程度、彼らは、加速度の積分 (速度への) と一定速度の積分 (位置への) が、半分ずつ重なるように、それぞれずらしてあるという飛躍的なアイデアを持っています。これにより、時間の可逆性や安定性など、シミュレーションの「リアリズム」にとって精度よりも重要な要素がもたらされます。そして、「リアリズム」、信憑性は、ビデオ ゲームにとってより重要です。正確な質量が実際に引き起こした位置とはわずかに異なる位置に何かが動いても、見た目感触があれば気にしません。現実的。私たちは、高性能の衛星望遠鏡をどこに向けて遠くの物体や将来の天体の出来事を見るかを計算していません. ここでは、数学的精度よりも安定性と効率性が優先されます。ということで、リープフロッグ方式が妥当かと思われます。リープフロッグを可変時間ステップに適応させると、この利点の一部が失われ、ゲームの物理に対する魅力の一部が失われます。Stormer-Verlet はリープフロッグに似ていますが、個別に維持された速度ではなく、前のステップの平均速度を使用します。このStormer-Verletをリープフロッグと同じ方法で適応させることができます。前方の速度を一定の加速度と統合するには、前のステップの長さの半分と次のステップの長さの半分を使用します。真のリープフロッグのようにステップが固定されていれば、それらは同じ長さになるため、2 つの半分の長さの合計は 1 になります。前のステップと同様に、ステップ サイズには h、加速度/速度/位置には a/v/p、「最後」には hl/pl を使用します。これらは実際には方程式ではなく、代入演算に似ています。

元のリープフロッグ:

v = v + a*h
p = p + v*h

可変時間ステップの場合:

v = v + a*hl/2 + a*h/2
p = p + v*h

要因a/2:

v = v + a*(hl + h)/2
p = p + v*h

前の位置(p - pl)/hlを初期速度に使用する:

v = (p - pl)/hl + a*(hl + h)/2
p = p + v*h

代わりに、必要ありませんv:

p = p + ( (p - pl)/hl + a*(hl + h)/2)*h

配布h:

p = p + (p - pl)*h/hl + a*h*(h + hl)/2

結果は、元のストーマー形式の Verlet ほど単純でも高速でもありません2p - pl + a*h^2。これが意味をなすことを願っています。実際のコードでは最後のステップを省略します。2h回乗算する必要はありません。

于 2016-03-07T02:09:49.830 に答える