3 ポイント 投稿者 GN⁺ 2024-05-25 | 1件のコメント | WhatsAppで共有

2D剛体衝突の解決

問題の定義

  • マリオが雲を踏むことから、レーシングゲームで2台の車が衝突することまで、衝突を扱うことはほとんどのビデオゲームで非常に重要な要素です。
  • このブログシリーズでは、物理シミュレーションの実際の数学と物理学を扱います。
  • ビデオゲームは、こうした概念を文脈の中に置き、より抽象的でなくするための良い方法です。

数学についてひとこと

  • この記事では数学が多く登場しますが、数学を難しく考えすぎないでほしいです。
  • 数学の記法は複雑に見えるかもしれませんが、その大半は単純な算術です。
  • 数学を恐れず、ぜひ挑戦してみてください。

始める前に

剛体

  • 剛体物理学は、変形しない物体を扱う物理シミュレーションです。
  • 実際にはすべての物体が分子レベルでは変形しますが、シミュレーションではこれを単純化して剛体として扱います。

衝突検出と衝突解決

  • 衝突検出は、シーン内でどの物体が衝突しているかを確認する過程です。
  • 衝突解決は、衝突した物体がどのように動くべきかを決定する過程です。
  • このブログシリーズでは、衝突解決の段階に焦点を当てます。

私たちがやろうとしていることは?

  • ほとんどのゲームは大きなループの中で実行されます。
  • 各ゲームループの反復ごとに、物体の位置は現在の速度に応じて更新されます。
  • 速度は、大きさと方向を持つベクトルです。

速度

  • 速度は、一定時間における物体の位置変化を表します。
  • 物体の新しい位置は、現在の速度と時間間隔を掛けた変位を足すことで計算されます。

衝突解決

  • 衝突解決の目標は、衝突後に物体の速度を変更し、物体同士がそれ以上めり込まないようにすることです。
  • 衝突後の速度は、衝突前の速度と、衝突によって生じる速度変化の和として表せます。

衝突とは何か?

  • 2つの物体が衝突中かどうかを確認するには、次の2つの条件が満たされている必要があります:
    1. 物体の幾何学的形状が接触しているか、重なっていなければなりません。
    2. 物体がなおも衝突の方向へ動いていなければなりません。

表面法線

  • 物体を表面からできるだけ遠くへ移動させるには、表面に垂直な方向へ動かす必要があります。
  • この方向を法線方向と呼び、表面に垂直な方向です。

内積

  • 2つのベクトルがどれだけ同じ方向を向いているかを計算するには、内積を使います。
  • 内積は、2つのベクトルの対応する要素の積の総和として定義されます。
  • 内積の符号から、2つのベクトルが同じ方向か反対方向かを知ることができます。

結論

  • 衝突は、ある物体の点が別の物体の点と接触し、相対法線速度が負のときに発生します。
  • 次の記事では、衝突の実際の物理学について扱う予定です。

GN⁺の意見

  • 物理シミュレーションの重要性: ゲーム開発において、物理シミュレーションは現実感を高める重要な要素です。
  • 数学の役割: 数学は物理シミュレーションの中核であり、これを理解すればより良いシミュレーションを作れます。
  • 衝突解決の複雑さ: 衝突解決は、単に物体の位置を更新するだけでは済まない複雑な過程です。
  • 教育的価値: この記事は、物理シミュレーションの基礎を理解するうえで大いに役立ちます。
  • 追加学習: 物理エンジンを自分で実装してみるのも良い学習方法です。Box2DやChipmunkのようなオープンソース物理エンジンを参考にできます。

1件のコメント

 
GN⁺ 2024-05-25
Hacker Newsの意見

Hacker Newsコメントまとめ要約

  • Hey everyone, author here!

    • これはブログシリーズの第1回の記事で、ゲーム開発者ではない人や数学の背景があまりない人を対象にしている。
    • そのため、概念を詳しく説明している。
    • 質問があればいつでも歓迎とのこと。
  • Oh! Look, a well-researched, deeply-explained, and interactive post.

    • ドメイン名とTLDが.skiなのを見て、別の素晴らしい記事を書いていた著者かと思ったが、別人だった。
    • 記事の質は同じくらい素晴らしい。
    • .ski TLDの秘密が気になる。
  • One side project I am working on right now is a 2d space shooter I am developing with my son.

    • 息子と一緒に2D宇宙シューティングゲームを開発中。
    • ゲームエンジンを使わずに自作してみようとしたが、衝突検出の問題で苦労した。
    • 最終的にBox2Dを使うことにした。
    • 20年以上の開発経験と数学の背景があっても、この問題を過小評価していたと気づいた。
  • I always enjoyed the explanation from the N game: N game tutorial

    • Flashが流行していた頃、N gameの解説を楽しく読んでいた。
  • I had fun building a TypeScript demo about this topic, involving balls that can bounce and collide. I learned a lot.

    • 跳ねたり衝突したりするボールを扱うTypeScriptデモを作りながら、多くを学んだ。
    • コード
    • 結果/デモ
  • 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

    • 関連する古くて良いブログ記事を思い出した。
    • 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.

    • 12年以上前に書いた興味深いプログラムの紹介。
    • Busy Boxes