通过许多领域进行光线拾取的最佳算法

时间:2013-05-13 01:04:03

标签: algorithm opengl raytracing

在我的OpenGL应用程序中,我有很多领域(超过100.000),并且我愿意实施有效的光线拾取算法。

到目前为止我的方法是天真的:

计算与鼠标指针对应的光线(在对象空间中),然后将我拥有的每个球体与光线相交。虽然这种方法对于我的应用来说可能足够快(球体的实际渲染速度可能比用光线挑选它们慢得多),但我想知道哪种方法适用于这种情况。

我特别关注这些球体可能具有任意半径的事实,而且我不知道如何在空间分区结构(如八叉树)中考虑这一点。

你有什么建议吗?

我将添加更多细节:

所讨论的应用是一种分子观察器,其中原子被表示为球体,如下图所示:

enter image description here

球体可以部分或完全重叠。场景可以是动态的(你可以进行分子模拟),但你通常不想在动画中选择任何东西。

理想情况下,我希望找到一种解决方案,将来也可以扩展到汽缸。

2 个答案:

答案 0 :(得分:3)

有趣的问题!

Ray vs. Sphere碰撞测试是最简单的测试之一,也就是为什么球体通常用于确定PVS(潜在可见集)。

基本上你用更大的球体包围球体。首先,您使用巨大的球体测试射线碰撞,如果失败,您可以确定此大体积内的任何其他球体也不会与射线发生碰撞。 如果光线发生碰撞,那么只需在体内移动并测试组中的下一个球体......该层次结构将节省大量的计算时间。

O(N)(测试每个球体),您可以达到 O(Log N)(就像二叉树或四/八叉树一样)。< / p>

一个问题是,当您的层次结构是动态的,那么您将不得不重建球体。您可以重建整个树 - O(n Log n),或者智能并仅重建层次结构的移动部分。 如果K球正在移动,那么重建时间可以减少到 O(K Log N)(例如移除特定球体,然后再次插入)

此处是教程about pickinga wiki about bounding spheres

的链接

答案 1 :(得分:2)

好吧,如果你允许球体连接到八叉树的内部节点,那么超大的球体可能只是在任何一个级别都不会破坏它们。

编辑: 为了进一步讨论,了解球体是否允许重叠以及它们是静态的还是动态的也是有用的。

相关问题