2D物理エンジンを構築するにはどうすればよいですか?[閉まっている]


20

私が作った最も高度なゲームは、物理エンジンBox2dFlashAS3で作られた8ボールプールゲームとレベルのあるプラットフォームゲームです。

プラットフォームゲームをするとき、エンジンを再利用できるように、エンジンの作り方を常に知りたいと思っていました。斜面、曲線の斜面、完全な重力、現実の物理学を備えたゲームを見たとき、エンジンのコーディング方法を知っていたらと思っていました。

関連する知識ベースが必要な場合は、テクニックや記事を提案してください。


回答:


16

私がお勧めしている間に対してそれをやった経験以外に独自の物理エンジンをロール(ちょうどあなたが完了したら、あなたはおそらくそれを捨てるべきで実現する-それは、すべてのedgecasesを取得することは本当に難しいと数値の上限/安定性の問題を整理、既存のエンジンに貢献することで時間をより有効に活用できる可能性があります)、次のリソースをご覧ください。

プールホールレッスン:円または球間の高速で正確な衝突検出では、円/円および球/球の衝突について説明します。

Nチュートリアルの分離軸定理ベースの検出と応答の基本的な理解のために素晴らしいです。


9

Erin Cattoは、Box2Dの実装に関するすべてのGDC講義をオンラインで行っています。私の経験では、Box2Dには読みやすいコードもあります。


PDFは本当に厳しい材料です。しかし、あなたが言ったように、私がcppとhファイルを読んだとき、それらは「理解可能」です。ありがとう。
ヴィシュヌ

+1。また、Box2Dは安定性にも非常に注意を払っています。これは、自分で転がすときに非常に難しいことの1つです。
無駄のない

5

方法は次のとおりです。

近似運動

すべての物理オブジェクトには次のベクトルが必要です。

  • 位置:オブジェクトが存在する場所。
  • 速度:位置がどのように変化するか。
  • 加速度:その速度はどのように変化していますか。

したがって、直感的に、すべての物理オブジェクトに対して、フレームごとにこのようなことを行う必要がありますa

a.speed    += a.acceleration
a.position += a.speed

落とし穴:これはオイラー法として知られています統合のます。この近似は、速度と加速度が小さく、時間ステップが小さい場合に適しています。ゲームでは、これは通常真実です。しかし、オブジェクトが薄い壁に向かって、または別の移動中のオブジェクトに向かって非常に速く移動する場合、その位置が完全に交差するのに十分な量だけ増加すると、オブジェクトとの衝突をスキップする場合があります。動きの速いオブジェクトがある場合、これを回避するには連続衝突検出が必要になる場合があります。

衝突

衝突は、この種のシーケンスで近似できます。

  1. 検出:2つの物体が交差することが検出されます。
  2. 解像度:各ボディの位置が変更され、交差しなくなりました。
  3. 物理:運動量、摩擦、反発(弾力性)を考慮して、各ボディの速度が変更されます。

これは、離散点で発生するため、離散衝突検出として知られています。各ステップには注意が必要です。

ステップ1:衝突検出(衝突はありますか?)

以下のための二つの円:それらの中心がより離れて自分の半径の和よりもある場合だけ確認してください。

以下のための2つの長方形:チェック彼らのコーナー座標のいずれかが他の長方形内にある場合。

より複雑なポリゴンを含むものについては、別の質問のトピックであるSeparating-Axis-Theoremが必要です。

落とし穴:他にも多くの衝突タイプが考えられます。いくつかは本当に複雑です:凸ポリゴンは複数回交差する可能性があります

ステップ2:衝突の解決(それらを離す)

衝突を解決する簡単な方法は、衝突検出から得られた値を使用して最小侵入による変換です。これには、基本的に、可能な限り最小の移動距離でオブジェクトを離すことが含まれます。

例として、円の1つが所定の位置に固定されている円と円の衝突を考えます。最小変位ベクトルの方向は、中点ベクトル間の差と同じです。その長さは、半径の合計と中心間の距離の差です。

このアイデアは、他の形状に簡単に一般化できます。

落とし穴:両方の衝突するオブジェクトが可動である場合、それらの動きの信頼できる近似を得るために、全体の距離のある割合で両方のオブジェクトを動かす必要があります。彼らは明らかに異なる方向に移動する必要があります。

ステップ3:衝突物理学(その他の変更)

起こりがちな最も明らかなことは、1つまたは2つのオブジェクトが方向を変える、つまり速度ベクトルを回転させることです。これは非常に簡単に実装できます。

落とし穴:オブジェクトは弾力性があるかもしれませんが、そうではないかもしれません。その場合、システムの総エネルギーが減少します。空気抵抗のためにドラッグが必要になる場合があります。摩擦(特に静摩擦)は実装複雑なことで有名ですです。

いくつかの結論

現実をシミュレートしたい場合、現実のシミュレーションは指数関数的に難しくなります。数え切れないほどのエッジケース、驚くほど難しいフォーミュラ、増え続ける研究論文の地雷原に足を踏み入れています。

ニーズが単純な場合、または学習したい場合は、試してみてください。

ニーズが複雑な場合、または数学が気に入らない場合は、物理エンジンを使用して詳細を確認してください。Box2DBulletはゲームでかなり人気があります。



4

1
wildbunnyのブログエントリは素晴らしいです。+1。
共産主義のダック

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.