3Dロジックを組み込んだシンプルなゲームを実装しています。移動する球が円柱と衝突するかどうかを検出するための手順または/および相対方程式は何ですか?私の円柱は静的な右円形で、z軸に位置合わせされています。この場合の円柱の方程式は(x --a)²+(z --b)²=r²であると読みました。ここで
(a、b):円柱の中心r:円柱の半径
これを使用して、2つのオブジェクトが交差しているかどうかを確認し、さらに、ボールの対応する応答を適用するにはどうすればよいですか?
ありがとうございました
3Dロジックを組み込んだシンプルなゲームを実装しています。移動する球が円柱と衝突するかどうかを検出するための手順または/および相対方程式は何ですか?私の円柱は静的な右円形で、z軸に位置合わせされています。この場合の円柱の方程式は(x --a)²+(z --b)²=r²であると読みました。ここで
(a、b):円柱の中心r:円柱の半径
これを使用して、2つのオブジェクトが交差しているかどうかを確認し、さらに、ボールの対応する応答を適用するにはどうすればよいですか?
ありがとうございました
多くの場合、円柱から球へのテストは、ポイントからラインへのセグメントテストに簡略化できます。
これとの妥協点は、球から円柱へのテストではなく、球からカプセルへのテストを効果的に行うことです。この妥協に耐えられるのであれば、ここにいくつかの擬似コードがあります。
vector cylCenterVector = endPoint2 - endpoint1;
float distanceFactorFromEP1 = Dot(sphereCenter - endPoint1) / Dot(cylCenterVector , cylCenterVector );
if(distanceFactorFromEP1 < 0) distanceFactorFromEP1 = 0;// clamp to endpoints if neccesary
if(distanceFactorFromEP1 > 1) distanceFactorFromEP1 = 1;
vector closestPoint = endPoint1 + (cylCenterVector * distanceFactorFromEP1);
vector collisionVector = sphereCenter - closestPoint;
float distance = collisionVector.Length();
vector collisionNormal = collisionVector / distance;
if(distance < sphereRadius + cylRadius)
{
//collision occurred. use collisionNormal to reflect sphere off cyl
float factor = Dot(velocity, collisionNormal);
velocity = velocity - (2 * factor * collisionNormal);
}