球は次のように定義されます
[centerX,centerY,centerZ,radius]
と面はあなたがの方向に沿って移動した場合に
[normalVectorX,normalVectorY,normalVectorZ,distance]
の距離が平面に原点からの距離であると定義されます法線ベクトル。言い換えれば、法線ベクトルの各成分に距離を掛けると、平面上のどこかにポイントが置かれます。
球が平面又は他の一方の側にあるかどうかをテストする:
プロジェクト垂直な平面上への球の中心、球の半径を加算し、その和は、平面距離未満である場合、交差していない。他のプレーンの
CENTER = [centerX,centerY,centerZ]
NORMAL = [normalVectorX,normalVectorY,normalVectorZ]
isBelowHighPlane = dotProduct(CENTER,NORMAL)+radius < distance
、和が大きい場合、半径、テストを引く、「下」面を言うことができます:
isAboveLowPlane = dotProduct(CENTER,NORMAL)-radius > distance
上記試験の両方が該当する場合したがって、球体であります含まれています。
注:あなたの平面が空間A、B、Cでの3点で、たとえば、他のいくつかの方法で定義されている場合は、あなたが任意の2辺の外積を取ることによって、正常に見つけることができます:
normalVector = normalize(crossProduct((B-A),(B-C)))
あなたがその法線ベクトルを持っていたら、あなたが通常の上に、これらの点のいずれかへの原点からのベクトルを投影することによって距離を見つけることができます。
distance = dotProduct(B,normalVector)
注
は、距離が負でもよいです。
だから、あなたが選ぶどんな言語で必要な3D機能は以下のとおりです。
dotProduct()
、crossProduct()
、およびnormalize()
あなたはそれを含む大きな球に小さな球からいくつかの接続を持っており、その大きな球体がある場合完全に入っていても完全に入っていても、すべての小さな球体の状態を即座に知ることができます。ただし、大きな球が完全に外れているかどうかをテストするには、テストで追加のバリエーションが必要です。
isAboveHighPlane = dotProduct(CENTER,NORMAL)-radius > distance
isBelowLowPlane = dotProduct(CENTER,NORMAL)+radius < distance