【问题标题】:Find collisions of detailed 3D-Objects查找详细 3D 对象的碰撞
【发布时间】:2015-12-21 00:13:59
【问题描述】:

我目前正在编写一个应用程序,该应用程序应检查是否可以按照设计师的预期方式对齐不同的条和连接器。 为此,我想加载条和连接器的 3D 模型(波前对象),按照设计者的预期放置它们并检查不同模型之间的碰撞。

现在,当我在搜索碰撞检测时,我通常会读到,您永远不应该根据网格检查碰撞,而是简化模型,因此我尝试过的大多数工具甚至不允许您根据网格,或者他们简化了这个过程。问题是人们大部分时间都在谈论游戏开发,但我的用例完全不同。我什至不需要非常有效率。每秒一次检测就绰绰有余了,而游戏当然更频繁地需要这些检查。

现在我正在使用 BulletSharp(子弹物理引擎的 .Net 包装器),我得到了不错的结果。当我首先简化我的网格(使用 HACD 凸分解)然后检查碰撞时,它大部分时间都可以工作,但有时当部件彼此非常接近时,我会在不应该有碰撞的情况下发生碰撞,就像你可以看到的那样在图片上(红色表示零件之间存在碰撞)。有趣的是,当我使用详细的对象模型而不是简化的对象模型时,它的效果会更差。

对于这种用例还有其他方法吗?也许其他可以帮助我的引擎或库(在 .Net 中最好但不一定)?

【问题讨论】:

  • 用什么方式简化模型?

标签: 3d collision-detection physics


【解决方案1】:

您可以为此使用 Z-Buffer

  1. 在没有测试对象的情况下渲染场景

    必须设置视图,以便测试对象在相机前完全可见。渲染除测试对象之外的所有对象。这将填充 Z 缓冲区

    有时对于复杂的场景最好使用剪切,因此将相机放置在测试对象内并渲染/测试...完成后将相机朝相反方向转动/移动并再次执行该过程,或者您可以使用 6 个方向而不仅仅是 2 个...

    这也取决于您需要的精度(最好的精度是在与相机投影平面共面的平面上获得的

  2. 现在使用 GLSL 或任何其他着色语言和测试对象

    所以着色器(片段着色器)不会渲染任何东西,而只会查询 z-buffer 值并测试“渲染”片段是否在已经渲染的内容中。

    如果然后将某些输出设置为 true 或使用渲染图元的索引,例如设置为相同位置的颜色缓冲区...

    不要将任何东西渲染到深度缓冲区,因此使用此着色器并仅渲染测试对象(不清除缓冲区)

  3. 扫描输出图像/缓冲区/什么

    因此,当您获得穿过场景的图元索引时,扫描所有输出以查找重叠图元。您拥有所需的所有信息,包括 3D 位置。您可以尽可能快地使用它来渲染您的场景,因此对于现代 3D gfx 卡即使在 30fps 的中等复杂对象上也没有问题

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多