我正在用C ++编写光线跟踪器,并且需要能够检查场景中每个对象的交叉点(稍后会进行优化),为此,我需要保留一个运行的类实例列表。在创建新实例时更新的指针列表将无法工作,因为据我所知,在初始化后无法增加数组的大小。如果有的话,我真的很喜欢内置的(到C ++)解决方案。
答案 0 :(得分:6)
您可以使用任意数量的STL容器。
答案 1 :(得分:4)
创建一个指向场景中对象的vector
(或set
)指针作为静态类成员,并让所有ctors将this
插入到集合中,并{ {1}}从集合中删除dtor
:
this
答案 2 :(得分:3)
std::vector
应该没问题(并且 是C ++标准的一部分)。
答案 3 :(得分:3)
我正在用C ++编写光线跟踪器,需要能够检查场景中每个对象的交叉点[...]
标准方法是空间图。最常见的是,使用八叉树,因为它们可以在三维空间中表达位置。平凡的是,空间树看起来像这样:
struct SpatialNode {
SpatialNode * children[8];
std::vector<object*> objects;
};
每个节点都有(隐式或显式)位置和大小。当一个新对象被添加到世界场景时,树会穿过孩子(占据由xy,yz和zx平面分割的八分圆:上面4个,下面4个;左边4个,右边4个;后面4个,前面4个),并且该对象仅添加到可以完全包含它的最小节点。 (显然,您需要能够计算对象的尺寸以及它们是否可以完全包含在给定区域内。)
这样做的好处是相当快(只有被检查的树的部分实际上是相关的),无论是填充它还是搜索它。有几篇文章可以在维基百科,GameDev.net和其他地方阅读。