python - Python 中的 3D 几何相交

标签 python 3d geometry mesh

我有一个遗传编程算法,可以通过障碍物为无人机轨迹(3D 线)演化出解决方案,这些障碍物是城市中的禁飞区。为了评估解决方案的适用性,我需要检查它们是否与禁飞区相交(对于数千次迭代,每次迭代约 200 次评估)

example route through barriers

在 2D 中,我可以使用 Shapely 轻松完成。然而,3D 问题要复杂得多。我目前正在使用具有 100 个顶点或 99 条线段的解决方案。典型的 3D 飞行路径(在测试用例中)长 2-10 公里,附近有 10 到 20 个障碍物。

目前障碍物是具有高度属性的 2D 多边形,但我希望能够为障碍物(以及表面)使用凹 3D 网格。转换/创建网格、多面体或面组不是问题,因为它只需完成一次。然而,评估必须进行 1000 次。

我很好奇是否有人知道进行这种 bool 交集检查的更简单/更快的方法。我正在考虑这些选项,目前还没有一个是完美的:

  • 检查线顶点是否包含在多边形的凸包中(scipy.spatial 或 this)这限制了我的凸性障碍
  • 检查线段是否与网格面相交/碰撞(Panda3D、Blender API,..)

使用 Shapely 检查交叉点几何边界是否位于障碍物的“事件”z 坐标范围内有效,但严重限制了可以使用的 3D 障碍物的种类。我将其称为 2.5D 解决方案..

这是一个 2D 场景的错误示例 gif:我有数百条线,想检查它们是否穿过绿色区域(此处只显示几条线)

solution evolution

有像 trimesh 和 rhino3dm 这样的 3D 几何包,但它们只支持线面相交。我不知道我是否需要一个庞大的图书馆,或者自己写点东西是否更有意义..

此外,由于速度是重中之重,我还考虑了不使用 Python 的解决方案。我希望有一个主要是数学的方法来做到这一点(没有我怀疑的开销,例如 Panda3D 或 Blender)。

最佳答案

在您的一条评论中,您说:

Even something that just checks line-segment vs triangle intersection should work

所以我的建议是对 fast, minimum storage ray-triangle intersection 使用 Möller–Trumbore 算法.

我开发了一个 Python 实现,您可以找到 here .从文档中可以看出,它非常易于使用,例如:

>>> vertices = np.array([[0.0, 0.0, 0.0], [0.0, 10.0, 0.0], [10.0, 0.0, 0.0]])
>>> ray_origin = np.array([1.0, 1.0, 1.0])
>>> ray_direction = np.array([0.0, 0.0, -1.0])
>>> intersection = ray_triangle_intersection(vertices, ray_origin, ray_direction)
(1.0, 0.1, 0.1)

是的,您说过您实际上并没有处理射线,但这可能是一个起点。

关于python - Python 中的 3D 几何相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74510900/

相关文章:

python - import pyzbar.pyzbar - 找不到 zbar 共享库

python - 在python中过滤文本以获得数值

3d - 阴影质量(阴影痤疮)

java - 打印出带有字符的 ASCII 圆和轴

algorithm - 给定点时如何确定哪个半径长

python - Django:我怎样才能获得一个模型来存储鞋子尺寸的列表(例如Python或无论如何)

python - 如何将大数据集连接到数据框 pandas

image - 在 HTML5/JavaScript 中将图像包裹在圆柱形对象周围

css - scaleZ() CSS 转换函数有什么作用?

ios - 圆形动画滞后