2

現在、3D バウンディング ボックスで範囲クエリを実行するために、ブースト ジオメトリ/空間インデックス ライブラリを使用しています。たとえば、クエリの境界ボックスと重なるすべての境界ボックスのリストを取得できます。

ドキュメント(http://www.boost.org/doc/libs/1_54_0_beta1/libs/geometry/doc/html/geometry/spatial_indexes/queries.html)は、少なくとも2Dではポリゴンを使用できることを示していますクエリ オブジェクトとしてバウンディング ボックスの代わりに。3D でもより高度なクエリ形状を使用することは可能ですか? 向きのあるバウンディング ボックス、ピラミッド、カメラ フラスタムなどのオブジェクトを考えています。もしそうなら:どうすればそれを行うことができますか/その例はどこにありますか?

ありがとう

4

3 に答える 3

2

私は同じ問題を抱えていました.@Adamとチャットした後、彼は問題を解決する次の解決策を提案しました.

#include <boost/geometry.hpp>

struct MyFrustum
{
    MyFrustum(int d) : dummy(d) {}
    int dummy;
};

namespace boost { namespace geometry {

// This will be called for Nodes and Values!

template <typename Box> inline
bool intersects(Box const& b, MyFrustum const& f)
{
    std::cout << "checking the intersection with " << f.dummy << std::endl;
    return true;
}

}}

#include <boost/geometry/index/rtree.hpp>

どうやら、コンパイラがデフォルトの実装にフォールバックしないように、物事が定義されている順序が重要です(まだ実装されていないエラーが発生します)。

役に立てば幸いです。Adam に感謝します。

于 2014-04-01T06:57:40.143 に答える
1

ここでの他の回答は素晴らしいですが、私が含めたり宣言した順序に関係なく、Xcodeでまだ問題が発生しました。自分の環境でこれを機能させることができない他の人のために、この回答を投稿しています。ここにある他のソリューションは、Visual Studio 2013 ではうまくいきましたが、Xcode 5.1.1 ではうまくいきませんでした。そのコンパイラにはオーバーロード解決の問題があるようです。解決策は、次のように、「ボックス」にテンプレート型を使用することを避け、すべての具象型を直接使用することです。

#include <boost/geometry.hpp>

namespace bg = boost::geometry;
using point3d = bg::model::point<float, 3, bg::cs::cartesian>;
using box3d = bg::model::box<point3d>;

namespace boost { namespace geometry {

    template <> inline
    bool intersects(box3d const& b, MyFrustum const& p) {
        // your implementation
        return true;
    }
}
于 2014-11-04T21:02:13.820 に答える