2D剛体衝突の解決
問題の定義
- マリオが雲を踏むことから、レーシングゲームで2台の車が衝突することまで、衝突を扱うことはほとんどのビデオゲームで非常に重要な要素です。
- このブログシリーズでは、物理シミュレーションの実際の数学と物理学を扱います。
- ビデオゲームは、こうした概念を文脈の中に置き、より抽象的でなくするための良い方法です。
数学についてひとこと
- この記事では数学が多く登場しますが、数学を難しく考えすぎないでほしいです。
- 数学の記法は複雑に見えるかもしれませんが、その大半は単純な算術です。
- 数学を恐れず、ぜひ挑戦してみてください。
始める前に
剛体
- 剛体物理学は、変形しない物体を扱う物理シミュレーションです。
- 実際にはすべての物体が分子レベルでは変形しますが、シミュレーションではこれを単純化して剛体として扱います。
衝突検出と衝突解決
- 衝突検出は、シーン内でどの物体が衝突しているかを確認する過程です。
- 衝突解決は、衝突した物体がどのように動くべきかを決定する過程です。
- このブログシリーズでは、衝突解決の段階に焦点を当てます。
私たちがやろうとしていることは?
- ほとんどのゲームは大きなループの中で実行されます。
- 各ゲームループの反復ごとに、物体の位置は現在の速度に応じて更新されます。
- 速度は、大きさと方向を持つベクトルです。
速度
- 速度は、一定時間における物体の位置変化を表します。
- 物体の新しい位置は、現在の速度と時間間隔を掛けた変位を足すことで計算されます。
衝突解決
- 衝突解決の目標は、衝突後に物体の速度を変更し、物体同士がそれ以上めり込まないようにすることです。
- 衝突後の速度は、衝突前の速度と、衝突によって生じる速度変化の和として表せます。
衝突とは何か?
- 2つの物体が衝突中かどうかを確認するには、次の2つの条件が満たされている必要があります:
- 物体の幾何学的形状が接触しているか、重なっていなければなりません。
- 物体がなおも衝突の方向へ動いていなければなりません。
表面法線
- 物体を表面からできるだけ遠くへ移動させるには、表面に垂直な方向へ動かす必要があります。
- この方向を法線方向と呼び、表面に垂直な方向です。
内積
- 2つのベクトルがどれだけ同じ方向を向いているかを計算するには、内積を使います。
- 内積は、2つのベクトルの対応する要素の積の総和として定義されます。
- 内積の符号から、2つのベクトルが同じ方向か反対方向かを知ることができます。
結論
- 衝突は、ある物体の点が別の物体の点と接触し、相対法線速度が負のときに発生します。
- 次の記事では、衝突の実際の物理学について扱う予定です。
GN⁺の意見
- 物理シミュレーションの重要性: ゲーム開発において、物理シミュレーションは現実感を高める重要な要素です。
- 数学の役割: 数学は物理シミュレーションの中核であり、これを理解すればより良いシミュレーションを作れます。
- 衝突解決の複雑さ: 衝突解決は、単に物体の位置を更新するだけでは済まない複雑な過程です。
- 教育的価値: この記事は、物理シミュレーションの基礎を理解するうえで大いに役立ちます。
- 追加学習: 物理エンジンを自分で実装してみるのも良い学習方法です。Box2DやChipmunkのようなオープンソース物理エンジンを参考にできます。
1件のコメント
Hacker Newsの意見
Hacker Newsコメントまとめ要約
Hey everyone, author here!
Oh! Look, a well-researched, deeply-explained, and interactive post.
.skiなのを見て、別の素晴らしい記事を書いていた著者かと思ったが、別人だった。.skiTLDの秘密が気になる。One side project I am working on right now is a 2d space shooter I am developing with my son.
I always enjoyed the explanation from the N game: N game tutorial
I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.
This is great. This reminds me of Chris Hecker's Rigid Body Dynamics series from GDMag/Gamasutra that I read (checks watch) almost 30 years ago!
Collisions are violations of the pairwise non-intersection constraint between bodies.
If you want to go further and go for rigid body dynamics and constraint, I found that series of blog post very useful: Toptal blog post
To dredge up a related oldie-but-goodie memory of blog posts: Gaffer on Games
Guess this is a Shameless plug but I wrote an interesting program over 12 years ago using even then very old three Js which is not quite the metal but much less abstract than today's tools.