0

3Dロジックを組み込んだシンプルなゲームを実装しています。移動する球が円柱と衝突するかどうかを検出するための手順または/および相対方程式は何ですか?私の円柱は静的な右円形で、z軸に位置合わせされています。この場合の円柱の方程式は(x --a)²+(z --b)²=r²であると読みました。ここで

(a、b):円柱の中心r:円柱の半径

これを使用して、2つのオブジェクトが交差しているかどうかを確認し、さらに、ボールの対応する応答を適用するにはどうすればよいですか?

ありがとうございました

4

1 に答える 1

1

多くの場合、円柱から球へのテストは、ポイントからラインへのセグメントテストに簡略化できます。

  1. 線分は、円柱の中心を端から端まで通る線を表し、終点は既知です。
  2. ポイントは球のcenterPointを表します。
  3. このテストでは、centerPointに最も近い線分上のポイントを見つけ、ポイント間の距離を測定します。球の半径+円柱の半径よりも小さい場合は、衝突しています。

これとの妥協点は、球から円柱へのテストではなく、球からカプセルへのテストを効果的に行うことです。この妥協に耐えられるのであれば、ここにいくつかの擬似コードがあります。

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);

}
于 2013-03-09T15:40:04.860 に答える