CCD は高速で動く物体がオブジェクトを通り抜けたり突き通ったりしないで、オブジェクトに衝突させるためのものです。Unity は以下の CCD メソッドを提供します。
スイープに基づく CCD を使用するには、Inspector ウィンドウで Rigidbody を選択し、Collision Detection を Continuous または Continuous Dynamic に設定します。投機的 CCD の場合は、Collision Detection を Continuous Speculative に設定します。
スイープに基づく CCD は、衝突の瞬間 (Time For Impact、TOI) のアルゴリズムを使用して、オブジェクトが現在の速度で前方向へ移動する軌道をスイープすることによって、オブジェクトの潜在的な衝突の可能性を計算します。オブジェクトの移動方向で接触がある場合、アルゴリズムは衝突の時刻を計算し、その時刻になるまでオブジェクトを動かします。このアルゴリズムでは、より多くの CPU サイクルを使って、衝突時刻以降のサブステップを実行し、TOI 後の速度を計算してから、再度スイープすることができます。
ただし、この方法は直線的なスイープに依存しているため、物体の角運動を無視します。これは、オブジェクトが高速で回転しているときにトンネリングを引き起こす可能性があります。例えば、ピンボールマシンのフリッパーは端に固定され、固定点の周りを回転します。フリッパーは角運動のみを行ない、直線運動は行ないません。したがって、ピンボールとの衝突を簡単に逃してしまいます。
この方法のもう 1 つの問題はパフォーマンスです。CCD を設定した多数の高速オブジェクトが近接すると、スイープが増えるため CCD のオーバーヘッドが急速に増加し、物理エンジンはより多くの CCD のサブステップを処理する必要があります。
投機的 CCDは、オブジェクトの直線運動と回転運動の両方に基づき、オブジェクトのブロードフェーズで最小の軸平行バウンディングボックス (AABB) を拡張することにより機能します。このアルゴリズムは物理演算処理中にすべての潜在的な接触を取得するため、投機的です。それらの接触はすべてソルバーに渡され、すべての制約が満たされるため、衝突時にオブジェクトが貫通することはありません。
次の図は、経路に壁がない場合、t0 から移動する球がどのように t1 の予想位置に到達するかを示しています。AABB をターゲット位置に基づいて拡張することによって、投機的アルゴリズムは n1 法線と n2 法線による 2 つの接触を取得します。アルゴリズムによってソルバーがそれらの接触を無視しないように制御されているため、球は壁を通り抜けません。
現在の速度に基づく拡張した AABB は、移動軌道に沿ったすべての潜在的な接触を検出するのに役立ち、ソルバーによるトンネリングを防げます。
投機的 CCD は一般に、スイープに基づく方法よりもコストがかかりません。なぜなら、接触は衝突判定段階の間にのみ計算され、解決段階や積分段階では計算されないからです。また、投機的 CCD は、オブジェクトの直線運動と角運動に基づいてブロードフェーズの AABB を拡張するため、スイープに基づく CCD が見逃すような接触も検出できます。
ただし、投機的な CCD は、オブジェクトの動きが投機的な接触点の影響を受けるゴースト衝突 (Ghost Collision) を引き起こす可能性があります。これは、投機的 CCD が直近の点のアルゴリズムに基づいてすべての潜在的な接触を取得するからです。そのため、接触点の法線はそれほど正確ではありません。これにより、高速のオブジェクトがテッセレーションされた衝突面に沿ってしばしばスライドし、必要ない場合でもジャンプしてしまいます。例えば下の図では、球は t0 から始まり、右に向かって水平に移動します。積分後の予測位置は t1 になります。拡張した AABB はボックス b0 と b1 と重なり、CCD は c0 と c1 に 2 つの投機的な接点を生成します。投機的な CCD は直近点アルゴリズムを使用して接点を生成するため、c0 は非常に傾いた法線を持ち、ソルバーにとって傾斜のように見えます。
このように法線は非常に傾いていると、積分後に t1 がまっすぐ前方に移動せず、上方に飛んでしまう原因になります。
さらに、投機的な接触は、衝突検出段階にのみ計算されるため、投機的な CCD はトンネリングを引き起こすことがあります。接触解決の間に、オブジェクトがソルバーからあまりに大きなエネルギーを得ると、積分後に最初に拡張した AABB の外側に飛び出してしまう場合があります。 AABB のすぐ外側に衝突がある場合、オブジェクトはすり抜けます。
例えば、次の図は、棒が時計回りに回転する間に球体が t0 から左に移動する様子を示しています。衝突によって球にあまりにも大きなエネルギーが加えられると、t1 で拡張した AABB (赤い点線の矩形) から出る場合があります。AABB のすぐ外側に衝突がある場合、下の青色のボックスのように、球がそれをすり抜けてしまう場合があります。これは、ソルバーは解決段階と積分段階では拡張した AABB 内の接点の計算のみを行い、衝突検出を行わないためです。
2018–10–12 公開ページ
投機的衝突判定は2018.3 で追加 NewIn20183
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.