我当前正在编写一个应用程序,该应用程序应检查是否可以按照设计人员的意图对齐不同的条形和连接器。 为此,我想加载条形和连接器的3D模型(Wavefront Objects),按照设计者的意图放置它们,并检查不同模型之间的碰撞。
现在,当我搜索碰撞检测时,我通常会读到你永远不应该根据网格检查碰撞,而是简化模型,因此我尝试的大多数工具甚至不允许你检查碰撞在网格上或他们简化了这个过程。问题是人们大多数时候都在谈论游戏开发,但我的用例却完全不同。我甚至不需要非常有效率。每秒一次检测就足够了,而游戏当然更需要这些检查方式。
现在我正在使用BulletSharp(子弹物理引擎的.Net包装器),我得到了不错的结果。当我首先简化我的网格(使用HACD凸分解)然后检查碰撞时,它大部分时间都可以工作,但有时当部件彼此非常接近时,当不应该有任何碰撞时,我会发生碰撞,就像你一样可以看到图片(红色表示,部件之间有碰撞)。有趣的是,当我使用详细的对象模型而不是简化的对象模型时,它会更糟糕。
此类用例是否有其他方法?也许其他引擎或库可以帮助我(最好但不一定在.Net中)?
答案 0 :(得分:0)
您可以将 Z-Buffer 用于此
渲染没有测试对象的场景
必须设置视图,以便测试对象在相机前面完全可见。渲染除测试对象之外的所有对象。这将填充 Z-Buffer 。
有时对于复杂的场景最好使用剪切,因此将摄像机置于测试对象内并进行渲染/测试...完成后,向相反方向转动/移动摄像机并再次执行此过程,或者您可以使用6个方向而不仅仅是2个...
这还取决于您需要的精度(在与摄像机投影平面共面的平面上获得最佳精度
现在使用GLSL或任何其他着色语言和测试对象
因此着色器(片段着色器)不会渲染任何内容而只会查询 z-buffer 值并测试是否"呈现"片段在已经呈现的内容中。
如果然后将某些输出设置为true或者使用渲染图元的索引设置为例如在同一位置的颜色缓冲区...
不要向深度缓冲区渲染任何内容,因此请使用此着色器并仅渲染测试对象(不清除缓冲区)
扫描输出图像/缓冲区/什么
当您获得穿过场景的原语索引时,扫描重叠基元的所有输出。您拥有所需的所有信息,包括 3D 位置。您可以尽可能快地渲染场景,因此对于现代 3D gfx卡,即使在中等复杂对象的30fps上也没问题