私のプログラムには、いくつかの立方体があります (単純な xyz 位置、xyz サイズ)。これらの立方体の 1 つを取り、そこから別の立方体を「差し引く」ことができるようにしたいと考えています。
私の質問は、結果として得られる 3D オブジェクトを表現するための優れた一般的なデータ構造とは何ですか? また、3D ソリッドを別のソリッドから差し引くにはどのようなアルゴリズムが使用されますか?
私のプログラムには、いくつかの立方体があります (単純な xyz 位置、xyz サイズ)。これらの立方体の 1 つを取り、そこから別の立方体を「差し引く」ことができるようにしたいと考えています。
私の質問は、結果として得られる 3D オブジェクトを表現するための優れた一般的なデータ構造とは何ですか? また、3D ソリッドを別のソリッドから差し引くにはどのようなアルゴリズムが使用されますか?
これは非常に一般的な質問であり、固体について知りたいことと、それをどれだけ早く知りたいかによって異なります。メンバーシップ テストのみが必要であると仮定すると、これは機能する可能性があります (疑似コード):
class Solid {
Solid solids = [] // each Solid has a list of solids that
// have been subtracted from it.
abstract method containedInSelf(point) {
// this will obviously vary from one type of solid to another
}
method contains(point) {
if !containedInSelf(point) return False;
else {
for solid in solids { // loop over all contained solids
if solid.contains(point) return False;
// point is contained in a solid that has been subtracted from it
}
// Now we know that point is contained but not contained in anything
// that's been subtracted
return True;
}
}
method subtract(solid) {
solids.append(solid)
}
}
これには、複合減算ができるという利点があります。たとえば、ソリッドからソリッドを減算A
しB
、次にソリッドB
からソリッドを減算C
すると、期待どおりに機能します。たとえば、原点 と を中心とする 3 つの球を使用すると、 に含まれる、または に含まれるが含まれないradius(A) < radius(B) < radius(C)
点が得られます。A
C
B
たとえば、球から 2 つの 12 面体を減算し、それを立方体に減算することもできます。これはもちろん、立方体から球を差し引いて、2 つの 12 面体を足し戻すことと同じです。
そのレベルで幾何学的オブジェクトを表現する標準的な方法があるとは思えません。
3Dシーンを表現するための優れたテキスト言語を持ち、幾何学的操作(結合、交差など)の完全なセット「Constructive Solid Geometry」を含む、オープンソースのレイトレーサーであるPovrayを思い出します。それは非常に柔軟ですが、あなたが探しているものではないと思います。さらに、レイトレーサーには、純粋なジオメトリ (テクスチャ、ライトなど) とは別に、処理する概念がいくつかあることに注意してください。