【问题标题】:3D Graphics Picking - What is the best approach for this scenario3D 图形拾取 - 这种情况的最佳方法是什么
【发布时间】:2013-08-16 10:02:26
【问题描述】:

我正在开发一个允许用户在场景中选择 3d 对象的项目,我想知道每个人都认为处理这个特定场景的最佳方法是什么。

基本上,我们的场景至少包含 100 个对象(它们是低多边形,但由至少 ~12-15 个三角形组成)和最多约 1000-2000 个对象。

并非所有对象都始终“可拾取”,因为某些对象会遮挡其他对象,因此“可拾取”对象可能落在 800-1500 之间(取决于场景的复杂性)。

当一个对象被“拾取”时,我们希望它以某种方式突出显示,这意味着以不同的方式渲染它,这很简单,但我们希望不仅可以通过单击完成拾取,还可以通过拖动来完成 - 这意味着我们想要在很短的时间内大量运行拣货算法。理想情况下,用户会在对象仍处于“拖动”操作时看到突出显示的对象 - (这意味着应该异步完成拾取,以免滞后于主渲染?)。

我尝试过简单的光线追踪拾取,但这显然很慢,因为我们循环遍历场景中的所有三角形以找到对象。

我还尝试过基于 GPU 的拾取 - 使用像素缓冲区渲染场景,为每个对象提供独特的颜色,但通过拖动操作,这意味着多次渲染和 GPU 到 CPU 的数据传输,性能不佳.

我是否可以探索其他可能性来尝试获得我想要的性能和功能?

感谢您的宝贵时间。

【问题讨论】:

  • 除了八叉树方法之外,您应该首先测试更简单的包围体。例如。球体射线相交的测试非常便宜。如果光线没有击中包围体,则无需尝试光线是否击中网格。
  • 所以您是说创建球体的八叉树以及边界框并首先测试球体会有所帮助?
  • 不,如果你在八叉树中发现了潜在的命中,你需要分析是否真的有命中。这可以通过首先检查包围体来加速。
  • 抱歉,当然,这是有道理的。感谢您的帮助。

标签: 3d directx gpu picking ray-picking


【解决方案1】:

我以前用过 Octree 来做这类事情,这似乎是我最好的选择。每个对象都可以放在相应的节点中,并通过通常的 Octree 协议进行测试。真正的好处来自在当前节点为空时将光线投射偏移到空间节点的末尾。与暴力破解相比,这肯定会给您带来显着的收益。

以下链接应为您提供 Octree 的基础及其设置方式:Introduction to Octrees

虽然该链接只是为您提供基础,但使用 Octree 只是为了减少必要的检查,因此根据您的问题判断,您似乎已经具备执行实际操作所需的知识采摘。

【讨论】:

  • 啊,好吧,我想我没有遇到过这种方法,你有链接到某个地方可以很好地解释它吗?
  • @poncho 我找不到任何提供确切信息的链接,但你以前用过八叉树吗?如果没有,一旦你熟悉了它,你会发现你可以缩小你执行的交叉测试的范围。为了进一步优化,您可以“加速”光线通过空节点,因为您知道不必在那里执行测试。
  • 啊,好的,谢谢,不,我以前从未使用过八叉树,但我在这里找到了一个很好的解释 (castle-engine.sourceforge.net/vrml_engine_doc/output/xsl/html/…),所以我现在就去实现它。
  • 我目前正在努力将八叉树添加到我的采摘中,但我有点困惑。我有一个动态环境,所以如果我的环境看起来像这样:castle-engine.sourceforge.net/vrml_engine_doc/output/xsl/html/… - 然后我在图像中最近的立方体的左侧添加一个立方体,我的八叉树如何知道它必须“生长”以及哪个八叉树叶子采用新立方体??
  • @Poncho 每当您将对象添加到八叉树时,您只需将节点分开,直到满足特定条件。我通常做的是每个节点只能有一个对象的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多