4

我正在用 C++ 编写光线追踪器,并且需要能够检查与场景中每个对象的交集(稍后会进行优化),为此,我需要保留类实例的运行列表。创建新实例时更新的指针列表将不起作用,因为据我所知,在初始化后无法增加数组的大小。如果有一个内置(C++)解决方案,我真的很想要。

4

4 回答 4

6

您可以使用任意数量的 STL 容器。

STL 容器参考

于 2010-07-09T00:18:21.760 回答
4

创建一个vector(或set)指向场景中对象的指针作为静态类成员,并将所有 ctor 插入this到集合中,并从集合中dtor删除this

// really pseudo-code -- not intended to compile as-is, but I hope it helps
// convey the general idea.
//
class scene_object { 
    static std::set<scene_object const *> instances;
public:

    scene_object() : { instances.insert(this); }
    scene_object(scene_object const &other) { instances.insert(this); }
    // probably more ctors here...

    ~scene_object() { instances.delete(this); }
};

std::set<scene_object> scene_object::instances;
于 2010-07-09T00:15:30.197 回答
3

Astd::vector应该没问题(它C++ 标准的一部分)。

于 2010-07-09T00:10:10.400 回答
3

我正在用 C++ 编写光线追踪器,并且需要能够检查与场景中每个对象的交点 [...]

标准方法是空间图。最常用的是八叉树,因为它们可以在 3 维空间中表达位置。简单地说,空间树看起来像这样:

struct SpatialNode {
    SpatialNode * children[8];
    std::vector<object*> objects;
};

每个节点都有一个(隐式或显式)位置和大小。当一个新对象添加到世界场景中时,树会穿过孩子(占据被 xy、yz 和 zx 平面分割的八分圆:4 上,4 下;4 左,4 右;4 后, 4 在前面),并且该对象仅添加到可以完全包含它的最小节点。(显然,您需要能够计算对象的尺寸以及它们是否可以完全包含在给定区域内。)

这具有相当快的好处(只有被检查的树部分实际上是相关的),无论是在填充它还是在搜索它时。您可以在 Wikipedia、GameDev.net 和其他地方阅读有关它的几篇文章。

于 2010-07-09T05:54:09.537 回答