私は三角法を磨く必要があり、簡単な数学的モデルでここで助けてくれることを願っています。ここに添付されている画像でこれまでのところ私のモデルです。ボールが非常に速く動いている場合、フレームアニメーションに他の問題があることは承知していますが、今のところはballDxとballDyを計算するだけです。また、ballDx = 0(垂直移動のみ)である可能性もありますが、ボールがたわむと、ballDxは異なる値を取得する可能性があります。
私は三角法を磨く必要があり、簡単な数学的モデルでここで助けてくれることを願っています。ここに添付されている画像でこれまでのところ私のモデルです。ボールが非常に速く動いている場合、フレームアニメーションに他の問題があることは承知していますが、今のところはballDxとballDyを計算するだけです。また、ballDx = 0(垂直移動のみ)である可能性もありますが、ボールがたわむと、ballDxは異なる値を取得する可能性があります。
回答:
注:以下のすべては、ボールの表面に摩擦がないことを前提としています(そのため、ボールが回転したり、跳ね返ったりすることはありません)。
衝突の瞬間に、ボールはコーナーに触れます。固体オブジェクトが衝突すると、いわゆる表面法線に沿って、つまり衝突点で表面に垂直に力が作用します。
ボールなので、表面に垂直な方向はボールの中心に向かっています。さて、力の方向はわかっています。その大きさはどうですか?弾性衝突(および長方形は移動できない)を想定すると、ボールは衝突したのと同じ速度で跳ね返らなければなりません。
(nDx、nDy)を衝突後の速度、(oDx、oDy)衝突前の速度、(x、y)衝突点でのボールの位置とします。さらに、ボールが衝突するコーナーが(0,0)にあると仮定します。
洞察を公式として表現すると、
(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)
次と同等です:
nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2
最後の式に最初の2つの式を代入すると、次のようになります。
(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2
二項トーレムを使用した拡張
(a+b)^2 = a^2 + 2ab + b^2
収量:
oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0
この2次方程式にc
は2つの解があり、そのうちの1つは0です。明らかに、衝突の結果としてボールの方向が変化するため、明らかにそれは私たちの関心のある解ではありません。他の解決策を得るために、両側をcで割って以下を取得します。
(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0
あれは:
c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
要約すると、次のとおりです。
c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y
編集:コード内:
if (collision) {
float x = ballX - cornerX;
float y = ballY - cornerY;
float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
ballDx = ballDx + c * x;
ballDy = ballDy + c * y;
}
いくつかの実装上の考慮事項:シミュレーションステップの後、ボールの位置で(x、y)を近似できますが、この近似によりたわみの角度が変わるため、非常に顕著になるため、シミュレーションステップは非常に細かくする必要があります(おそらく、ボールはステップごとに直径の1/20を超えて移動しません)。より正確な解を求めるには、衝突が発生する時間を計算し、その時点でそのシミュレーションステップを分割します。つまり、衝突点までの部分ステップと、残りのステップに対して別の部分ステップを実行します。
編集2:影響点の計算
rを半径、(x0、y0)位置、(dx、dy)シミュレーションステップの開始時のボールの速度とします。簡単にするために、問題のコーナーが(0,0)にあると仮定します。
私たちは知っています:
(x,y) = (x0, y0) + (dx, dy) * t
欲しい
length(x,y) = r
あれは
(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____ _____/ \____________ ___________/ \_______ ________/
\/ \/ \/
a b c
それはtの二次方程式です。その判別式
D = b^2 - 4 * a * c
負であり、解決策はありません。つまり、現在のコースでボールがコーナーに到達することはありません。それ以外の場合、その2つの解は
t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)
衝突が始まった時間、つまり早い時間に興味がありt1
ます。
あなたの方法は次のようになります:
// compute a,b,c and D as given above
if (D >= 0) {
t = (-b - sqrt(D)) / (2 * a);
if (0 < t && t <= ts) {
// collision during this timestep!
x = x + t * dx;
y = y + t * dy;
ts = ts - t;
// change dx and dy using the deflection formula
}
}
x = x + ts * dx;
y = y + ts * dy;
At the moment of collision, the ball will be touching the corner
が、私はこの近似の正当化を見ません(そしてそれは真実ではないので近似でなければなりません-ボールはどちらのコーナーでもない2つの場所で触れています)。
問題を視覚的に確認する方法を次に示します。
元の問題セットは、円と長方形です(下の画像の灰色)。これは、ポイントと丸みのある長方形(黒で表示)に相当します。
したがって、これはマルチパートの問題です。4つの線(元の円の半径でボックスの端から押し出された)と4つの円(元の円の同じ半径の長方形の角)に対する点衝突をテストしています。
元の画像の大まかな速度では、ポイントは右下隅の円に当たります。あなたがしなければならないのは、あなたがヒットするコーナーサークル上のポイントを見つけ、その角度を計算し、それから反射することです。
その派生物は、読者の練習問題として残しておきます。
私はゲームに取り組んでおり、ここでも立ち往生しています。しかし、私はそれがこのようになると思います:
別の見方があります 私の問題は、新しいdx、dyをすばやく計算する方法がわからないことです(従来の数学を使用する私にとっては、非常に多くの計算が必要です)。
キネマティクスとは、計算に最も便利なように、参照フレームとして正しいものを選択することです。
ここでは、まず、軸をボールの中心と角の間の線に平行(x ')および垂直(y')の成分に分解する変換Tを定義します。逆変換T *は、元の座標系を復元します。
この新しい参照フレームでは、反射(および物理学の時間と空間の対称性)により、接触Mの速度変換(ポイントインパルス)がx 'コンポーネントを反転し、y'コンポーネントを変更しないままにします。マトリックス用語これは、対角線上の対角行列と-1と1です。
衝突後の速度は、単純にV ' = T *です。M。T。Vo。
衝撃の時間tが、その後だけ(のためのソリューションであるT。ド)+(X。T。電圧Vo)(T)= R Xが X軸射影演算子であり、rは球の半径です。再配置、我々は入手
T =(R - (T。ド))/((X。T。電圧Vo)(T))
これには、厳密に記述、テスト、およびデバッグされた標準グラフィックスライブラリにすべての複雑な数学を埋め込むという明確な利点があります。このソリューションは、2Dと3Dの状況でも同じです。グラフィックライブラリを切り替えるだけです。最後に、物理問題に取り組む前に、まず適切な参照フレームについて考える必要があることを強調します。NIHの誘惑は常に存在しますが、実際には、より簡潔なソリューションが利用可能な場合のバグのレシピにすぎません。