0

私のレイ トレーサーでは、バウンディング ボリューム階層を構築しています。このエラーを修正するために数日使用しましたが、何か根本的に間違っているようです。

この最初のメソッドは、呼び出される構築であり、typedef std::vector Objects 配列を使用する以下のメソッドです。

void BVH::build(Objects* objs)
{
    // construct the bounding volume hierarchy
    int size = objs->size();

    // Calculate the bounding box for this node
    BBox bb = (*objs)[0]->boundingBox();
    for ( int p = 1; p < size; p++ )
        bb.expandToInclude( (*objs)[p]->boundingBox());
    Vector3 pivot = (bb.max + bb.min) * 0.5f;
    tree.bbox = bb;

    int split = qsplit(objs, size, pivot.x, 0);

    tree.left = subdivision(objs, split, 1);
    tree.right = subdivision(&objs[split], size - split, 1);
}

このメソッドは、私のバイナリ ツリーのリーフ ノードを構築するために、以下のメソッドで使用されます。

Node* BVH::makeLeaf(Objects* objs, int num)
{
    Node* node = new Node;
    if ( num == 1 ) { node->objs = &objs[0]; }
    else if ( num == 2 ) { node->objs = ((&objs)[0],(&objs)[1]); }
    node->isLeaf = true;
    return node;
}

これは、オブジェクトの配列を使用してノードとリーフ ノードを分割および構築する再帰的な方法です。

Node* BVH::subdivision(Objects* objs, int size, int axis)
{
    if ( size == 1 ) { return makeLeaf(objs, 1); }
    if ( size == 2 ) { return makeLeaf(objs, 2); }

    Node* node = new Node;
    node->isLeaf = false;

    BBox bb = (*objs)[0]->boundingBox();
    for ( int p = 1; p < size; p++ )
        bb.expandToInclude((*objs)[p]->boundingBox());
    node->bbox = bb;
    Vector3 pivot = (bb.max + bb.min) * 0.5f;

    int split = qsplit(objs, size, pivot[axis], axis);

    node->left = subdivision(objs, split, (axis + 1) % 3);
    node->right = subdivision(&objs[split], size - split, (axis + 1) % 3);

    return node;
}

このコードを実行すると、サブディビジョン内でセグメンテーション違反が発生します。

gdb からの null ポインターの投稿は次のとおりです。

debug: Loading "teapot.obj"...
debug: Loaded "teapot.obj" with 576 triangles

Program received signal SIGSEGV, Segmentation fault.
0x000000000040bb9e in BVH::subdivision (this=0x61f0c0, objs=0x61f100, size=5, axis=1) at BVH.cpp:44
44      BBox bb = (*objs)[0]->boundingBox();
(gdb) bt
0  0x000000000040bb9e in BVH::subdivision (this=0x61f0c0, objs=0x61f100, size=5, axis=1) at BVH.cpp:44
1  0x000000000040bdef in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=9, axis=0) at BVH.cpp:56
2  0x000000000040bd62 in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=18, axis=2) at BVH.cpp:53
3  0x000000000040bd62 in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=36, axis=1) at BVH.cpp:53
4  0x000000000040bd62 in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=72, axis=0) at BVH.cpp:53
5  0x000000000040bd62 in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=144, axis=2) at BVH.cpp:53
6  0x000000000040bd62 in BVH::subdivision (this=0x61f0c0, objs=0x61f0a0, size=288, axis=1) at BVH.cpp:53
7  0x000000000040b9ca in BVH::build (this=0x61f0c0, objs=0x61f0a0) at BVH.cpp:21
8  0x00000000004121ac in Scene::preCalc (this=0x61f0a0) at Scene.cpp:42
9  0x0000000000402fde in makeTeapotScene () at assignment1.cpp:113
10 0x000000000040f973 in main (argc=1, argv=0x7fffffffe798) at main.cpp:65
(gdb) p (*objs)[0]
$1 = (Object *&) @0x0: <error reading variable>
4

2 に答える 2

2
(&objs)[0]

と同じです

*(&objs)

これはと同じです

objs

同じやり方で、

(&objs)[1]

と同じです

objs + 1

これは、有効なオブジェクトのアドレスではない可能性があります。

この線

node->objs = ((&objs)[0],(&objs)[1]);

カンマ演算子を使用しているため、の値を破棄してに(&objs)[0]設定node->objsしますがobjs + 1、これは無効です。

その課題が何を達成することを期待しているのかわからないので、何に置き換えるべきかわかりません。

于 2013-03-13T21:46:06.620 に答える
0

この興味深い typedef で何時間も使用した後、友人の助けを借りて、変換するアダプター メソッドを作成しました。

vector<Object*>* into vector<Object*>& 

これにより、すべてのメソッドがよりクリーンで見栄えが良くなりました。

void BVH::build(Objects* objs_orig)
{
    m_objects = objs_orig;
    std::vector<Object*>* objs = objs_orig;
    return build(*objs);
}

void BVH::build(const std::vector<Object*>& objs)
{
    tree = makeTree(objs, 1);
}
于 2013-03-14T01:43:04.620 に答える