【问题标题】:How to check if two convex polyhedrons intersect with each other in Three.js?如何在 Three.js 中检查两个凸多面体是否相互交叉?
【发布时间】:2015-04-26 07:05:15
【问题描述】:

我正在解决一个需要随机生成凸多面体并将其放入立方体/圆柱容器中随机选择的点而不重叠的问题。我正在使用 来获取图形输出。

A demo.

放置多面体时,如何检查它是否与其他多面体相交?

所涉及的凸多面体只是简单的四面体或六面体,并使用 THREE.ConvexGeometry 构造。由于我需要精确检查,边界框是不够的,我只是用它来确保两个多面体不相交。

我做了很多研究,发现了很多复杂的理论和方法,我需要的是得到一个布尔结果来判断两个凸多面体之间是否存在交集。 3D 中的 SAT (Separating Axis Theorem) 已经足够好了,但 Three.js 似乎无法做到这一点。谁能告诉我如何以简单的方式进行这种检查,或者只是解释如何在 3D 中使用 SAT 进行检查?

【问题讨论】:

  • 您想要准确,您可以将两个对象放入一个对象中并比较每个帧上的两个顶点、法线多边形位置?您将需要一遍又一遍地遍历每个顶点,并且可能只增加一点空间,因此不必精确
  • 不需要每帧都精确,我只需要在创建多边形的那一刻进行检查。当找到一个交叉点时,我需要它来确定。我确信SAT 可以在 2d 和 3d 中执行此操作,您可以查看一下。 @Careen
  • 但是如何确保新网格不与现有网格相交?即使新的随机位置和要创建的多边形的所有顶点都不在现有的多边形之一中,多边形的边仍然有机会与其他对象相交。 @Careen
  • threejs.org/docs/#Reference/Core/Geometry- 在创建遍历所有顶点面等的循环时,您有所有属性要检查是否有任何拦截,并首先检查甚至使用边界框...如果返回 true 而不是计算确定拦截是否为真,然后循环遍历 3d 空间中的所有内容
  • 请给你的场景图片....

标签: three.js javascript 3d three.js intersection


【解决方案1】:

你可以看看http://www.realtimerendering.com/intersections.html。尽管该站点是从 2011 年开始的,但相交算法在过去几年中没有改变。从演示来看,一旦多面体被放置在立方体中,它们就不会移动。所以 SAT 算法不是最好的解决方案,因为它用于移动多面体。

【讨论】:

    【解决方案2】:

    Gilbert-Johnson-Keerthi 是一种强大的算法,可以测量距离并检查凸多面体之间的交叉点。我仍然认为最好在简单的多面体上使用,否则支持函数中的计算可能需要一些时间。一个可能的缺点是你需要有能够测量一个点和另一个点/线段/三角形之间距离的函数,我不知道是否有一些在three.js中可用。

    http://en.wikipedia.org/wiki/Gilbert%E2%80%93Johnson%E2%80%93Keerthi_distance_algorithm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-07
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-03
      • 2011-04-19
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多