93112
### 質問内容

2Dゲームの当たり判定で動く物体同士が衝突した時、現実世界で２つの物体がぶつかった時と同じように位置を修正してその場所に描画するための方法が知りたい。

### 条件

  * 長方形、正方形等の矩形
  * お互いが動いていて移動量が不確定で、移動方向も不確定、高速に動きすり抜けの場合も想定したい
  * ３つ４つのオブジェクトが一つのシーンで同時に不確定の方向で移動方向も不確定で動く

### 実験したこと、試したこと

  * 点と線分で考えて取りえず線分の場合は交差座標を求めてその場所に移動してから大きさの分動いた方向と逆の方向にめり込み修正 ※なお正方形や長方形は線分ではないためこれじゃ実装出来ません。

  * 取りえず正方形に絞って考えて正方形の四隅に移動量と方向を持ったベクトルを持たせてその方向の線分と当たって来るオブジェクトとの線分との当たり判定を実装 ※なお衝突座標の算出方法がわかりません。

### 実現したいこと

現実世界と同じように２つの移動する物体がぶつかった時。現実同じ位置に物体の位置を修正したい。

### 知りたいこと

現実世界で２つの物体がぶつかった時の位置関係と同じ位置に修正したいがめり込み量の修正のためには衝突した際に`どこの点`から座標を修正すればいいのでしょうか？

[![画像の説明をここに入力](https://i.stack.imgur.com/IIDE1.png)](https://i.stack.imgur.com/IIDE1.png)
CC BY-SA 4.0
2022-12-27T12:51:42.007
93048
2022-12-31T05:27:22.667
2022-12-31T05:27:22.667
3060
55177
question
c++
2Dゲームで複数の動く物体同士が衝突したときの衝突座標を取得する方法
自分の知る限り、「ふたつの物体が衝突しているかどうか判定する」部分と「衝突した場合、反発する計算をする」部分は分けて考えるのがよくある方法です。

矩形同士の衝突を考える場合、質点同士の衝突と違って回転する可能性があることに注意が必要です。傾いている矩形同士が衝突しているかどうか判定しないといけませんし、衝突した後に回転し始める場合があります。このような場合にどう計算するかはそう簡単ではありません。質問者さんのおっしゃる「衝突座標」だけでは解決できないのではないかと思います。

自分が知っている中だと、たとえば 2 次元物理シミュレーションができるライブラリである
[Box2D](https://github.com/erincatto/box2d) は実装が公開されていて解説記事もあり学習に便利です。

  * [Video Game Physics Tutorial - Part II: Collision Detection for Solid Objects](https://www.toptal.com/game/video-game-physics-part-ii-collision-detection-for-solid-objects)
  * [Video Game Physics Tutorial - Part III: Constrained Rigid Body Simulation](https://www.toptal.com/game/video-game-physics-part-iii-constrained-rigid-body-simulation)

日本語だと、「物理エンジン 自作」みたいな検索ワードが便利なのではないかと思います。詳細には読めていませんがいくつか見つかった記事をリンクしてみます。

  * [自作2D物理エンジンを作った話](https://qiita.com/edo_m18/items/f7698c5bd262df4f9cf3)
  * [物理エンジンの作り方 (PDF)](https://cedec.cesa.or.jp/2008/archives/file/pg07.pdf)
CC BY-SA 4.0
2022-12-30T14:53:03.217
93112
2022-12-31T03:38:56.223
2022-12-31T03:38:56.223
19110
19110
93048
answer